-
클래스와 인스턴스의 관계 이해하기각종 학습 요약/Java 2022. 5. 10. 16:01
클래스와 인스턴스의 관계 이해
오늘 부트캠프 학습을 진행하면서 동기들과 많은 이야기를 했는데, 그 중에서도 클래스와 인스턴스의 관계/차이에 대해 이야기 해보려고 한다. 짧고 간략한 예시로 설명하고자 하는데, 작게나마 도움이 되면 좋겠다.
메로나로 설명하는 클래스와 인스턴스의 관계
예를 들어서 설명할 수밖에 없다.
메로나 레시피를 작성해보자.
메로나 레시피: 메로나는 색소는 초록색이다. 메로나의 단맛은 설탕 50g이다. 메로나의 적정온도는 영하 18.5도다. 메로나는 한 입 깨어물면, 시원한 상태를 돌려준다. 메로나를 한번에 두입 이상 깨어물면, 머리가 아픈 상태를 돌려준다.
레시피는 하나의 '정의서'다. 그 대상 물체가 어떠한 속성을 지니고 있는지, 어떤 동작들을 하는지, 대상의 구성 성질을 글로 풀어놓는 것이다.
java에서 레시피의 역할을 하는 것은 클래스class다.class 메로나 { // 메로나 레시피: String 색소 = "green"; // 메로나는 색소는 초록색이다. int 당분 = 50; // 메로나의 단맛은 설탕 50g이다. double 보관온도 = -18.5; // 메로나의 적정온도는 영하 18.5도다. // 메로나를 깨어물면 public BodyStatus 깨어물기(int 몇입) { if (몇입 == 1) { // 한 입 깨어물면, /* return : (먹은 사람에게) 돌려준다 */ return new BodyStatus("시원"); //시원한 상태를. } else { // 두입 이상 깨어물면, return new BodyStatus("아 머리아팡"); // 머리 아픈 상태를 돌려준다. } } }
처음의 레시피가 그대로 위와 같은 코드가 되었다.
레시피(클래스)에는 해당 대상이 실체(객체)가 될 때 가지고 있어야 할 특징(속성)을 값으로 가지고 있으며, 대상을 통해 하고자 하는 동작이 정의되어있다.이것을
인간
클래스에서 실체화해보면 어떨까? 보통 메로나는 사먹지만, 이인간
은 레시피를 기반으로 메로나를 만들어 먹는다.class 인간 { ...(생략)... String colorEnteringEye; // 눈으로 들어온 색상을 저장하는 용도 BodyStatus bodyStatus; // 인간의 몸상태를 저장하는 용도 public void 메로나먹기() { 메로나 mrn = // '메로나'라는 걸 만들어서 'mrn'에 보관할 건데... new 메로나(); // 보관하려면 실제로 '만들어야지' this.colorEnteringEye = mrn.색소; // 'mrn에 담아놓은', '윗줄에서 만든 메로나의 색소(색상)'를 이런식으로 확인할 수 있다. this.bodyStatus = mrn.깨어물기(2); //'mrn에 담아놓은' '윗줄에서 만든 메로나가 제공하는 동작'을 이런식으로 활용하고, 결과값도 받아볼 수 있다. } ...(생략)... }
이렇게
new
키워드를 써서 객체(인스턴스)를 만들고 나면,
해당 객체를 보관하고 있는 변수를 통해, 해당 객체를 이용할 수 있다.
해당 객체의 색상, 당분 같은 속성을 확인할 수도 있고
해당 객체가 제공하는 행동도 사용할 수가 있다.new
키워드 뒤에 오는메로나();
부분은, 메로나 클래스의 생성자다.
우리가 작성한 코드에는 생성자 부분이 따로 없지만, 모든 자바 클래스에는 생성자가 포함되어있어야 하기 때문에, 작성하지 않아도 기본 생성자(클래스명()
)가 존재한다. 다시 말해new
키워드를 통해 생성자를 호출할때, 레시피에 불과했던 클래스는 실재하는 객체, 인스턴스가 되는 것이다.정리
질문에 대한 답변을 떠올리면서 생각을 정리해보자.
질문을 클릭하면 답변이 펼쳐지니, 답을 생각하고 나서 눌러보자.👇클래스란?
클래스는 객체의 속성과 행동이 정의되어 있는 사양서다.
👇인스턴스란?
인스턴스란 사양서(클래스)를 그대로 따라서 만든 실체다.
👇클래스가 곧 인스턴스인가?
아니다. 클래스가 설계도라면, 설계도대로 만들어낸 것이 인스턴스다. 설계도는 앞으로 만들어서 사용할 것이 '개념'상태로 존재하는 거라면, 인스턴스는 실제 존재하게 된 '실체'상태다.
👇`new 클래스명();`에서 `클래스명()` 부분은 메소드를 호출하는 것인가?
아니다. 객체를 생성할 때 호출되는 것은 생성자다.
👇아무리 애를 써도 내용을 이해 못하겠는데 내 머리가 돌인것인가? 나는 Java 수업을 따라가기 글러먹은 것인가?
전혀 그렇지 않다. 수학 문제를 풀기 위해서 제일 먼저 수학적 정의를 달달 읊고 시작할 필요는 없다. 당장 풀기 위한 공식만 알고 풀면 된다. 풀다 보면 어느 순간 자연스레 개념이 들러붙는다. 그리고 그게 훨씬 빠른 학습 방법일지도.
'각종 학습 요약 > Java' 카테고리의 다른 글
Java: 제네릭 Generic (4) 2022.05.17 추상클래스와 인터페이스의 차이와 선택 기준 (0) 2022.05.13 # Java의 상속 개념 : inheritance, composite (2) 2022.05.12 Java: 생성자(Constructor)의 기본적인 이해 (0) 2022.05.11 객체지향프로그래밍(OOP) 개념의 기초적인 이해 (0) 2022.05.10 조금 특별한 타입: String (0) 2022.05.06