본문 바로가기

자바

4-2. 클래스와 객체 생성, 생성자

*클래스와 객체(둘의 관계)

 

 



자바에서 가장 많이 듣는 단어가 바로 이 클래스와 객체이다. 자바 프로그램을 작성할 때 쓰는 기본요소라고나 할까.

 

 

가장 일반적인 비유는

 

클래스 : 객체  =  붕어빵 틀 : 붕어빵

 

클래스는 객체를 만들어 내기 위한 기본적인 틀을 미리 정의한거고, 객체는 실제로 이 틀을 이용해 만들어낸 하나의 인스턴스이다.

 

 





 




*클래스

 




이제 본격적으로 클래스에 대해 알아볼 것임

 

 

-클래스의 구성 :

 

클래스 안에는 구성 요소들이 있는데 이것들을 멤버라고 부른다. 

 

멤버는 2종류 :

 

 필드(=멤버 변수) ,  메소드(=멤버 함수)

 

 

실제로 어떻게 생겼냐면,

 

Circle이라는 클래스를 정의해서 만들어 보면

 

public class Circle{                               //클래스의 선언은 class 키워드를 사용한다.  public은 접근지정자인데 뒤에서 다룰 거    

public int radius;

public String name;

 

public Circle(){                               //밑에 설명할거지만 class명과 동일한 메소드는 "생성자"라고 함. 객체생성할 때 초기화용도로 쓰임.

}

public double getArea(){

return 3.14*radius*radius           //메소드가 원면적을 구하는 일을 하고, 필드값 radius를 이용하고 있는 것을 알 수 있다.

}

}

 

 

빨간색 글자가 바로 필드이고 , 똥색글자가 메소드이다. 

 

위에 코드를 봐도 둘의 차이가 뭔지는 알겠지만(변수->필드,  함수->메소드).

 

 

좀 더 나아가서 실제 우리가 사는 현실에 대입해서 이해해보자면,

 

"사람"이라는 "클래스"를 만든다고 하면

 

필드는 "사람"에 대한 어떤 속성이나 성질이나 값 등등 일거고( ex>이름 , 직업,  나이 ...)

 

메소드는 "사람"이 하는 행동 같은 것들을 상징한다.( ex>먹기, 자기, 싸기 ...)

 

 

이 틀을 이용해서 "사람"이라는 객체를 만들어

 

이 객체에 값을 넣어서 (이름=짱구, 직업=유치원생.....)특정한 한명을 상징하게 되는 것이다.

 

 

 

 






*객체

 





위에서는 클래스를 만들어서 객체를 만들 수 있는 틀을 준비했다. 이제 이 틀을 이용해서 실제로 객체를 만들어 보자

 

public static void main(String args[ ]) {

Circle pizza ;

//Circle이라는 클래스를 이용해 pizza 것을 만들어 내는데, 그냥 보면 pizza라는 객체가 생겼구나 생각하기 쉽지만, 아니다

//그럼 뭐냐, pizza라는 레퍼런스 변수를 만든 것이다. 즉, 실제 객체가 위치 할 주소를 담을 통을 만든거다.

 

pizza = new Circle( );        //이제 진짜 Circle타입의 객체가 생성되었다.     //생성시에는 이렇게 new라는 키워드를 사용한다.

 

pizza.radius = 13;             //이제 실제로 객체가 존재하니, 이 객체의 필드(멤버변수)에 값도 넣고 접근도 할 수 있다.

                                    //접근하는 방법은 왼쪽에 보이 듯. (레퍼런스변수이름)+(.)점연산자+(멤버)

 

double area = pizza.getArea( );   //객체의 메소드를 실행할 수도 있다. area라는 변수를 만들어 메소드에서 얻어지는 값을 넣어주고 있다.  

}

 

 

 

이 부분은 실제로 메모리의 그림을 그리면서 이해하면 확실히 이해된다. 마음은 읽는 사람들을 위해 그려주고 싶지만, 너무 귀찮다...

 

나는 내 머릿속으로 그렸다. 못그리겠다면 도서관에 가서 자바프로그래밍 관련 책의 해당 단원을 뒤져보시길..

 

(참고로 명품java프로그래밍_생능출판사 개정4판 기준 p.181에 있긴 하다.)

 

 

 

 





*생성자

 






위에 설명했듯이 클래스를 만들 때 그 안에 클래스명과 동일한 메소드가 있다면 이 메소드를 "생성자"라고 한다.


이 생성자는 클래스 객체가 생성될 때 반드시 실행되는 메소드이다. 객체가 생성되는 순간에 실행되므로, 해당 객체의 초기화를 하는데에 주로


사용된다.




이 생성자에 대해서 자세히 알아보자



1. 클래스 안에 생성자는 아예 없을 수 있다.


근데 객체가 생성될 때, 이 생성자가 반드시 실행된다고 했다. 그래서 생성자가 없다면 실행시에 임의로 메소드 내용이 빈 생성자를 만든다.

(마치 위에 Circle()처럼 내용이 빈 것을 만든다.) 그러나 실제로 클래스 안에 이 생성자가 코드부분이 생기는 것은 아니다.



2. 생성자는 반드시 1개일 필요가 없다.(즉, 오버로딩이 된다.)



오버로딩에 대해서는 여기서 필요한 내용만 간략히 정리하자면 : 하나의 메소드 이름에 여러 개의 메소드


어떤 하나의 메소드가 있다고 하자, 그것과 이름이 동일한 이름을 가진 메소드가 또 존재 가능한데, 대신 이 메소드는 기존 메소드와 차이가 있다. 


일반적으로 메소드 매개변수의 타입이나 갯수로 구분이 되는데, 같은 이름에 1개를 초과해서 메소드를 적재해서 이름을 오버로딩이라고 하는 것


같다.




여튼 일반적인 메소드처럼 생성자도 오버로딩이 가능함.


처음 객체를 생성할 때, 전달되는 인자(argument)를 보고, 어떤 생성자를 실행할지 결정이 됨.





자 그럼 이제 1번과 2번 지식을 섞어보자. 이미 생성자들을 만들어 놓았는데, 처음에 객체 생성할 때 메소드의 인자가, 실제 클래스 안에 생성자들의 


매개변수들에 매칭되는 게 없다면? 어떻게 될까?



1번대로 생각한다면, 클래스에 호출한 메소드 형태의 인자를 가진 빈 메소드를 알아서 만들어서 오류없이 수행될 것이다. 그러나 실제로는 에러가 


난다. 



왜? 에러가 나지 않게 하는 방법이 있고, 적용할 수 있을 텐데, 굳이 에러가 나오게 했을까?



그건 바로 프로그래머의 의도를 반영하기 위함이다. 프로그래머가 유도한대로 생성자메소드를 호출하도록 하고자 함이다.

 

 

 

 

 

  

'자바' 카테고리의 다른 글

4-1. 클래스와 객체_객체 지향 언어의 특성  (0) 2018.06.04
3-3. main() 과 예외처리  (0) 2018.06.03
3-2. 배열  (0) 2018.06.03
3-1. 반복문  (0) 2018.06.02
2-2. 자바 기본 프로그래밍 (공부메모)  (0) 2018.05.31