자바 생성자
목차
생성자란 무엇인가?(Constructor)
생성자라는 뜻은 없었던 무엇을 만든다는 뜻 입니다. 영문의 의미로 보면 construct 는 건설하다, 구성하다의 뜻 입니다. construction 은 빌딩을 건설하다와 같은 의미가 있습니다.
자바 생성자는 인스턴스를 만들 때 초기화하는 일을 합니다. 그 동안에는 생성자를 만들지 않았는데 사실 자바 컴파일러는 기본 생성자(default constructor) 를 만들고 있습니다. 즉 소스코드에 생성자가 있는지 확인 후 없으면 기본 생성자를 만들어 줍니다.
public class Main { public static void main(String[] args) { Person mp = new Person(); mp.name = "James"; mp.showName(); mp.showRef(); } } class Person{ String name; void showName(){ System.out.println(name); } void showRef(){ System.out.println(this); } } [실행값] James com.Person@7ef20235
위는 이전 학습의 클래스를 약간 변형한 코드입니다. Person (사람) 클래스를 사용하는데 여기에 생성자를 더하려면 Person 클래스 안에 넣을 수 있습니다.
Person(){ name = "John Doe"; System.out.println("constructing... " + name); }
constructing... John Doe James com.Person@7b23ec81
사용자가 생성자를 만들면 컴파일러는 기본생성자를 만들지 않습니다.
생성자가 호출되는 시점은 인스턴스를 생성할 때 new Person() 이 때 생성됩니다. 따라서 생성자의 println 이 먼저 콘솔에 출력됩니다.
생성자의 특징은 마치 함수처럼 생겼는데 반환값이 없습니다. void 나 마찬가지죠.
기본 생성자(Default Constructor)
기본 생성자는 아래와 같습니다. 아무것도 안하는게 포인트입니다.
형식만 갖추는 것 입니다.
Person(){}
매개변수가 있는 생성자 오버로드
생성자는 매개변수를 사용하여 데이터를 입력받을 수 있습니다. 데이터를 받는 초기화의 이점은 필요에 따라 다른 데이터의 인스턴스를 생성할 수 있다는 점 입니다.
public class Main { public static void main(String[] args) { Person p1 = new Person("Mimi"); Person p2 = new Person("Tykon"); Person p3 = new Person("Lapi"); Person p4 = new Person(); p1.showName(); p2.showName(); p3.showName(); p4.showName(); } } class Person{ String name; public Person(){ name = "John Doe"; System.out.println("constructing... " + name); } public Person(String name){ this.name = name; System.out.println(this.name + "Constructed..."); } void showName(){ System.out.println(name); } void showRef(){ System.out.println(this); } }
자바 입문강좌에서 이전까지는 최대한 간단한 소스코드를 사용했는데 OOP(객체지향 프로그래밍)부터는 약간 소스코드가 길어졌습니다. 이제부터는 중반부에 들어왔으니 입문자 분들도 조금 긴 코드지만 적응하시길 바라겠습니다. 클래스를 설명하다 보니 좀 길어집니다.
위의 코드에서는 생성자가 2개 있습니다. public Person() 과 public Person(String name) 입니다. 매개변수가 없는 경우는 생성자가 자체 초기화를 합니다. 이 경우 name을 “John Doe” 로 만듭니다.
매개변수가 있는 경우… 그런데 이름이 Person 으로 같기 때문에 어떻게 구별을 하나요? 라는 의문이 든다면 매개변수를 보고 구별을 합니다. 즉 컴파일러는 Person 이란 식별자를 사용하는 생성자가 2개 인것을 확인하고 매개변수까지 확인합니다.
생성자를 호출하는 측에서 어떤 매개변수를 호출했느냐에 따라 생성자를 선택할 수 있습니다. 이것이 생성자 오버로드(Overload)입니다.
생성자만 오버로드가 되는게 아니라 메소드는 다 오버로드가 가능합니다. 매개변수가 다르다면 여러개를 생성할 수 있다는 규칙입니다. 이는 메소드의 큰 장점인데 해당 챕터에서 상세하게 학습할 것 입니다.
MimiConstructed... TykonConstructed... LapiConstructed... constructing... John Doe Mimi Tykon Lapi John Doe
결과창을 보면 생성자가 호출되는 시점은 new 키워드 순서이고 매개변수의 유무에 따라 자바 컴파일러가 2개의 생성자 중에 어떤 것을 선택할 것인지 결정한다는 것을 알 수 있습니다.
이 규칙을 잘 기억하고 향후 생성자 오버로딩을 사용하도록 합니다.
또 하나는 매개변수가 있건 없건 사용자가 생성자를 정의하면 컴파일러는 자동으로 기본생성자(default constructor)를 만들지 않습니다.
따라서 생성자 오버로드시에는 기본생성자를 만들어 주는 습관을 갖도록 합니다.
클래스를 만들다 보면 생성자 오버로드를 많이 사용합니다. 외부 라이브러리를 가져다 쓸 때 보면 생성자에서 이미 대부분의 데이터를 채워주기 때문에 사용자는 바로 커스터마이즈 부터 할 수 있습니다.
테크의 어려움
뒤로 가면서 생성자에 대해서도 다양한 테크닉을 배울 수 있습니다. 현재 단계에서는 생성자 오버로드가 가능하다. 정도 이해하면 충분합니다.
이 글을 쓰다보면 자꾸 뒤로 미루는 경우가 생기는데 어쩔 수가 없습니다. 프로그래밍은 아무리 초보들의 코드라도 완전한 기초부터 설명하면 많이 복잡합니다.
Hello World 를 이야기 하면서 ASCII 코드로 해설하면 대부분의 초보자는 프로그래밍이 매우 어렵다고 생각합니다. 그러나 Hello World 가 모니터에 잘 보이는지 몇 글자인지 확인하는 정도는 누구나 할 수 있는 코딩입니다.
순전히 코드를 바라보는 관점의 차이입니다.
프로그래밍은 중급단계 이후로 급격히 난이도가 오릅니다. 또 보통의 교재도 중반 이후가 넘어가면 어렵습니다. 왜냐하면 프로그래밍은 수학처럼 기초가 되는 앞 부분을 완벽히 이해한다는 전제를 깔고 시작하기 때문에 어렴풋이 이해한 지식으로는 진행이 잘 안됩니다.
이게 제일 심한 언어가 C언어 인걸로 알고 있습니다. 앞쪽에서 잘 이해 못하고 넘어가다 보면 동적메모리할당과 포인터 부분은 대단히 어려워집니다. 그래서 많이 포기하죠. 이거는 전세계 사람들 공통입니다.
다행이 유튜브 영상에 설명을 잘하는 분들이 많아서 지금은 어렵지 않게 배울 수 있습니다.
프로그래밍에서 대부분 고수들이 설명을 못하지는 않는데 생략을 많이 하는 편입니다. 스스로 이해한 것을 타인이 이해하도록 설명하는 것은 별개의 문제입니다.
그런 분들의 설명을 이해하려면 초보자가 실력을 쌓아서 중급자가 되는 수밖에 없습니다. 그게 어려우면 설명을 쉽게 하는 사람의 이야기를 듣는 것 입니다. 자세해야 하니까 시간이 더 걸립니다.
테크에는 이런 학습의 어려움이 있습니다. 몇 시간만 무슨 강의 들으면 나도 OO 한다. 요새 그런 문구 많이 보이는데 그건 마케팅이고 광고니까요. 무슨 이야기든 할 수 있습니다. 마치 다이어트 회사에서 ‘4주만에 20kg 감량한다’ 같은 말과 비슷합니다.
이 자바 입문강좌도 벌써 11회가 되었는데요. 입문자 분들에게는 앞으로의 설명이 좀 더 어려워질 것 같아서 미리 양해를 구합니다.
지식은 스스로 깨닫는 것도 어렵지만 나눠주거나 받는 것도 힘들일입니다.
중반부 이후가 어려워지는 것은 어떤 언어라도 마찬가지인데요. 하나의 팁은 어렵게 느껴지는 단계가 왔을 때 시간이 조금 더 걸리더라도 기초를 한번 더 다진 후 도전하는 것을 권합니다.
this 예약어(this reserved word)
this 예약어 여기서는 간략히 설명하겠습니다. 예를 들어 인스턴스로 myInstance 를 생성했습니다. myInstance.name 이건 밖에서 쓰는 이름이고 클래스 내부에서는 this.name 이라고 합니다.
public Person(String name){ this.name = name; }
보통 위와 같은 코드를 사용합니다. this.name은 인스턴스의 name 이고 그냥 name은 인수를 복사한 매개변수입니다. 의미가 같기 때문에 이름을 같이 하는 경우가 많은데 this 를 사용하면 명확하게 변수를 구분할 수 있습니다.
요약
자바 생성자에 대하여 알아봤습니다.
생성자는 다양한 인스턴스를 만들기 위한 초기화를 할 수 있습니다. 오버로드는 클래스를 더 유연하게 사용할 수 있도록 다양한 생성자를 추가하는 방법입니다.
자바 입문강좌가 벌써 11회로 본격적으로 객체 지향 프로그래밍의 세계로 들어가고 있기 때문에 난이도에 대하여도 체크해봤습니다.
외부참조문서
자바 생성자 Java Constructors (w3schools.com)
자바 생성자(constructor) | 자바 강좌 5-5