인프런 커뮤니티 질문&답변

liltjay님의 프로필 이미지
liltjay

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

인스턴스에 대해

해결된 질문

작성

·

555

1

안녕하세요~ 공부를 하다가 막히는 부분이 생겨 질문 드립니다.
인스턴스와 인스턴스 변수는 서로 다른건가요? 검색해보니 인스턴스 변수는 인스턴스가 생성될 때 생성된다. 라고 나와있는데 잘 이해가 가지 않습니다.

그리고 인스턴스 메소드도 잘 이해가 가지 않습니다..

BlackBox b1 = new BlackBox(); 에서
b1이 새로운 객체(인스턴스)인 것 까지는 알겠는데 단어가 비슷하다보니 잘 이해가 가지 않네요..!!

답변 4

1

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
😅 다른 분들이 멋진 답변들을 이미 해주셨네요!! 👍
이 자리를 비로소 두 분께 감사드립니다 👏👏👏

인스턴스는 클래스로부터 만들어지는 객체입니다. 흔히 비유하는 붕어빵 기계를 생각해보면, 붕어빵을 만들 수 있는 기계 (=설계도 또는 설명서 역할)가 클래스이며 그로부터 만들어지는 붕어빵이 인스턴스입니다.
스타크래프트 게임을 아신다면 테란의 배럭(= 클래스)에서 동일한 마린(= 인스턴스)을 수없이 뽑을 수 있는 것처럼, 인스턴스는 클래스로부터 얼마든지 만들 수 있게 됩니다. 즉 붕어빵 기계가 있다고 해서 붕어빵이 만들어지는 것은 아니며, 배럭이 있다고 해서 마린이 만들어지는 것은 아닙니다. 만들기 위해서는 붕어빵을 구워야 하고 마린 아이콘을 클릭을 해야 그때 비로소 만들어지는 것이죠.

인스턴스 변수는 각 인스턴스 내에서 어떤 값을 저장하기 위한 것입니다. 만약 똑같은 기계로 붕어빵을 만드는데 어떤 붕어빵은 팥으로, 어떤 붕어빵은 슈크림으로 그 속을 채운다면 2개의 서로 다른 붕어빵 인스턴스의 속재료(= 인스턴스 변수)에는 팥, 슈크림이라는 서로 다른 값이 저장될 것입니다.

public class FishBread { // 붕어빵 클래스
    public String ingredient; // 재료 변수 (인스턴스 변수)
}
FishBread bread1 = new FishBread();
bread1.ingredient = "팥";

FishBread bread2 = new FishBread();
bread2.ingredient = "슈크림";

즉 bread1, bread2 는 각각 팥 붕어빵과 슈크림 붕어빵으로 나뉘게 되는 것이죠.

인스턴스 메소드는 각 인스턴스가 동작을 하는 메소드입니다. 이 메소드에서 어떤 동작을 하는지는 클래스에 정의되어 있지만, 실제 동작을 했을 때 결과는 인스턴스에 따라 달라질 수 있어요. 가령 선생님이 학생들에게 "넌 이름이 뭐니?" 라고 물어보면 학생들의 대답이 모두 다른 것처럼 말이죠.

붕어빵에 이름표를 붙여서 판다고 하면, printName() 이라는 메소드를 통해 무슨 붕어빵인지를 알 수 있게 됩니다.

public class FishBread { // 붕어빵 클래스
    public String ingredient; // 재료 변수 (인스턴스 변수)

    public void printName() { // 붕어빵 이름 출력 기능 (인스턴스 메소드)
        System.out.println(ingredient + " 붕어빵");
    }
}

메소드에 구현된 코드는 분명 같지만 각 인스턴스가 가지는 ingredient 변수의 값이 다르기 때문에 출력 결과도 인스턴스마다 달라질 수 있죠.

FishBread bread1 = new FishBread();
bread1.ingredient = "팥";
bread1.printName(); // 팥 붕어빵

FishBread bread2 = new FishBread();
bread2.ingredient = "슈크림";
bread2.printName(); // 슈크림 붕어빵

위 코드의 실행 결과는 이렇습니다.

팥 붕어빵
슈크림 붕어빵


BlackBox 로 돌아와볼까요?

BlackBox b1 = new BlackBox();

라는 코드의 의미는 BlackBox 클래스로부터 새로운 객체를 만들고 이름을 b1 이라고 지어주는 것입니다. 이때 b1 은 BlackBox 클래스의 인스턴스라고 부릅니다. 그리고 b1 은 BlackBox 클래스에 정의된 것처럼 modelName 이라는 인스턴스 변수를 가집니다. 이 modelName 에 "까망이" 를 저장하게 되면 b1 인스턴스의 modelName 인스턴스 변수의 값은 "까망이"가 됩니다.

BlackBox b2 = new BlackBox();

라는 코드의 의미는 BlackBox 클래스로부터 새로운 객체를 만들고 이름을 b2 라고 지어주는 것입니다. 이때 b2 는 BlackBox 클래스의 인스턴스라고 부릅니다. 그리고 b2 는 BlackBox 클래스에 정의된 것처럼 modelName 이라는 인스턴스 변수를 가집니다. 이 modelName 에 "하양이" 를 저장하게 되면 b2 인스턴스의 modelName 인스턴스 변수의 값은 "하양이"가 됩니다.

정리하면, b1, b2 는 모두 BlackBox 클래스로부터 만들어진 인스턴스지만, 그들의 modelName 이라는 인스턴스 변수는 서로 다른 값을 가질 수 있습니다. 😊

감사합니다.

1

두번째 답변

인스턴스 변수는 인스턴스가 생성될 때 생성된다. 라고 나와있는데 잘 이해가 가지 않습니다.

그리고 인스턴스 메소드도 잘 이해가 가지 않습니다..

라고 질문해주신 내용도 한 번 답변 달아봅니다.. 이 역시도 틀렸으면 강사님이 도와주실꺼라는 믿음으로 ..히ㅏ하.. 😅

일단 "인스턴스 변수는 인스턴스가 생성될 때 생성된다 ' 라는 말을 설명해보겠습니다!

위에서 설명드린 것처럼, 인스턴스 변수는 코드를 다 작성하고 난 후 실행 버튼을 눌러야, 컴퓨터 메모리에 실제 입력이 되면서 생겨납니다.

그럼 당연히 실행버튼을 누르기전엔 객체 선언 상태에서는 인스턴스가 없으니 인스턴스 변수 (제품명, 화질, 가격, 색상) 이 생성되지 않습니다.

그리고 실행버튼을 누르고 난 후에야 인스턴스가 생성되면서 코드로 작성해놓은 제품명, 화질, 가격, 색상이 생성된다고 보시면 됩니다!


인스턴스 메소드가 뭔지 이해가 되지 않습니다, 라는 내용에 답변드립니다!

위 그림을 보시면 가장 왼쪽에 블랙박스 설계도에는 스펙(제품명, 화질, 가격, 색상) 내용과 블랙박스가 가져야 하는 기능 (촬영하기, 녹화하기) 이 적혀있습니다.

이 설계도대로 b1 이라는 블랙박스를 만들면, b1 이라는 블랙박스가 만들어지겠죠..!

그럼 저는 이 b1 이라는 블랙박스에서 녹화하기, 촬영하기를 할 수 있게됩니다.

이걸 그대로 컴퓨터로 옮긴다고 해보지요! (위 그림 참고)

설계도대로 b1 이라는 제품을 만든다. 그럼 설계도에 정의되어있는 "촬영하기, 녹화하기" 기능이 생산된 b1 이라는 제품안에 내장되어 있다.

-> 클래스대로 b1 이라는 제품을 만든다. 그럼 클래스에 정의되어있는 "촬영하기, 녹화하기 " 라는 메서드가 b1 이라는 인스턴스 안에 내장되어 있다.

라고 보시면 될 것 같습니다.

1

강사님께서 예로 드시는 블랙박스 회사를 기준으로 한번 설명해보겠습니다! (내용이 잘못되었으면 강사님이 바로 잡아 주실꺼라는 믿음으로 하하 😅)

 

블랙박스를 만드는 과정은 아래와 같습니다.

  1. 블랙박스 설계도를 만든다.

  2. 사장이 회사 직원에게 b1 이라는 블랙박스를 만들라고 시킨다.

    1. 제품명은 하양이, 화질은 FHD, 가격은 10만원, 색상은 화이트

  3. 직원이 지시사항을 이해하고, 생산 업무를 시작한다.

  4. 실제 b1 이라는 제품이 생산되고, 사장이 지시한 내용처럼 b1 이라는 제품을 만들어낸다.

그림으로 표현하면 아래와 같습니다!

그럼 이 과정을 그대로 현재 저희가 공부하고 있는 컴퓨터에 대입해보겠습니다!

1. 클래스(설계도) 를 만듭니다.

  1. 그리고 인텔리제이에서 컴퓨터한테 b1 이라는 객체를 만들어야 한다고 지시해야겠죠! 코드를 작성합니다.

여기서부터 질문자 분이 헷갈려하시는 내용인데요! 최대한 아는만큼 꼼꼼히 설명해보겠습니다!

BlackBox b1 = new BlackBox();

★ 위에 코드가 의미하는 바는 " BlackBox 라는 클래스(설계도) 를 이용해서 b1 이라는 "객체" 를 만들꺼야! " 라는 의미입니다.

여기서 핵심은 ' 만들꺼야! ' 입니다.

우리가 코드를 작성하면 실행을 해야 내용이 출력되지요? 마찬가지로 저 상태는 그냥 ' 코드, 단순히 글자 ' 일 뿐입니다.

즉 실체가 아니라 컴퓨터한테 이렇게 지시할꺼야! 라고 써놓은 것에 불과합니다.

그리고 실행 버튼을 누르면 컴퓨터는 ' 오호.. 얘가 이런걸 나한테 시키는구나! ' 라고 하면서 저희가 써놓은 코드를 읽어내면서 지시사항을 분석합니다. 그리고 이 지시사항이 끝나면 메모리에 정보를 입력해놓습니다!

메모리에 입력됐다는건 단순히 우리가 써놓은 코드가 단순 글자상태가 아니라 실제 컴퓨터에 데이터가 입력이 됐다는걸 의미합니다. 즉! 진짜 ' 실제로 존재하는 상태 ' 가 됐다는걸 의미합니다.

자 이제 이렇게 정리해보겠습니다.

클래스 - 설계도

객체 - 구현할 대상 / 아직까지는 글자(코드) 로만 존재함

인스턴스 - 코드를 분석해서 그 내용을 메모리에 직접 생성한 실제 존재하는 상태

라고 보시면 됩니다!

하지만 자바의 정석도 그렇고, 강사님의 강의에서도 그렇고 실제로는 ' 인스턴스 = 객체 ' 라고 봐도 무방합니다. 라고 설명해주십니다!

(저도 초보라 잘 모르지만.. 아무래도 컴퓨터를 연구하시는 분들의 입장에서는 깊이 연구하는 과정에서 저 두개의 용어를 구분해야 서로의 의사소통이 편해지니 나름 엄밀하게 구분하신 것은 아닐지 싶네요 ㅎㅎ./..;

아직 저같은 초보들한테는 그냥 인스턴스 = 객체 라고 봐도 무방할 듯 합니다.)

1

인스턴스는 하나의 객체를 사용하기 위해서 메모리에 로드되는 개념을 말하구요

인스턴스 변수는 메모리에 로드해서 사용하는 객체명 으로 이해하시면 됩니다.

위의 코드에서 b1 인스턴스 변수입니다.

즉 BlackBox 라는 인스턴스를 하나 생성해서 사용하는데 변수명을 b1 로 지정한다.

코드에서 어떤 객체를 사용하려면 메모리에 해당 객체의 공간이 할당 되어야 사용할수 있는데

자바에서는 메모리 할당할때 new 지시자를 사용해서 메모리에 할당하게됩니다

 

 

liltjay님의 프로필 이미지
liltjay

작성한 질문수

질문하기