[JAVA] 인스턴스 변수와 레퍼런스 변수의 차이

2023. 10. 13. 16:18·JAVA/개념 및 정리
반응형
public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    
    public Duck() {}

    public abstract void display();

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    public void swim() {
        System.out.println("모든 오리는 물에 떠요.");
    }
}

https://solution-is-here.tistory.com/191

 

디자인패턴 #1 전략 패턴 (Strategy Pattern)

전략 패턴은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해 줍니다.전략 패턴을 사용하는 경우 / 사용해야 하는 이유abstract class Duck { // 일반 메서드 quack public

solution-is-here.tistory.com

위 링크에 들어가면 전체 코드를 볼 수 있습니다.
Duck 추상클래스에서 생성한 FlyBehavior과 QuackBehavior은 인스턴스 변수일까? 레퍼런스 변수일까?
CS스터디를 진행하던 중 나온 질문이다.
명확하게 답이 나오지 않아서 공부를 할 겸 블로그에 두 변수의 차이를 작성하려고 한다.
 

인스턴스 변수와 레퍼런스 변수란❓

인스턴스 변수란?

  • 인스턴스가 생성될 때 힙 메모리에 할당되는 변수입니다.
  • 각 객체가 독립적으로 가지고 있는 값으로, 객체들마다 다른 값을 가질 수 있습니다.
public class MyObject {
    int instanceVariable;  // 인스턴스 변수 입니다.
}

 

레퍼런스 변수란?

  • 레퍼런스 변수는 메모리에 저장된 데이터나 객체의 주소값을 참조하는 데 사용하는 변수입니다.
  • 인스턴스 변수는 레퍼런스 변수를 통해 사용이 가능합니다. (. 을 통해서 사용할 수 있습니다)
MyObject myObject = new MyObject(); //레퍼런스 변수 입니다.

그러면 FlyBehavior, QuackBehavior은 레퍼런스 변수야? 인스턴스 변수야?

정답은 둘 다입니다. (정답이 둘다여서 스터디를 할 때 의견이 갈렸던 것 같네요...)
1. 인스턴스 변수일 때

  • FlyBehavior, QuackBehavior은 Duck 클래스가 생성될 때마다 객체의 FlyBehavior, QuackBehavior이 생성됩니다.
  • 각 객체는 각각의 FlyBehavior, QuackBehavior을 가지고 각 변수는 다른 구현체를 할당 받을 수 있습니다.

2. 레퍼런스 변수일 때
FlyBehavior, QuackBehavior은 인스턴스로써 구현 객체를 할당받을 수 있습니다.

  • FlyBehavior, QuackBehavior의 구현 객체를 참조할 수 있습니다.
  • 두 개의 레퍼런스 변수를 통해 구현체의 메소드(Fly, Quack)에 접근할 수 있습니다.

✅정리

간단히 정리를 하자면 Duck 클래스를 객체로 생성하는 클래스의 입장에서 보면 객체를 생성할 때마다 생성 되기 때문에 인스턴스 변수이고, Duck 클래스 내부에서 보면 구현체를 할당 받을 수 있기 때문에 레퍼런스 변수 입니다.

 

반응형
저작자표시 동일조건 (새창열림)
'JAVA/개념 및 정리' 카테고리의 다른 글
  • [JAVA] 상속과 구성
  • [JAVA] 정적 메소드는 언제 사용할까? (feat. 우테코)
  • [JAVA] 메소드 개념 및 정리
  • [JAVA] 클래스, 객체 개념 및 정리
코딩하는_대학생
코딩하는_대학생
Java Developer, Open Source Enthusiast, Proud Son
  • 코딩하는_대학생
    코딩하는 대학생에서 개발자까지
    코딩하는_대학생
  • 전체
    오늘
    어제
    • 분류 전체보기 (218)
      • 코딩하는 대학생의 책 추천 (8)
        • 클린코드 (5)
        • 헤드퍼스트 디자인패턴 (3)
      • Backend (8)
        • Spring (14)
        • AWS (3)
        • 회고 (4)
        • Redis (5)
        • 다양한 시각에서 바라본 백엔드 (3)
      • Python (35)
        • 개념 및 정리 (15)
        • 백준 문제풀이 (20)
      • JAVA (17)
        • 개념 및 정리 (14)
        • 백준 문제풀이 (2)
      • 왜? (7)
      • C언어 (42)
        • 개념 및 정리 (9)
        • 백준 문제풀이 (32)
      • 개인 공부 (27)
        • 대학 수학 (5)
        • 대학 영어 (10)
        • 시계열데이터 처리 및 분석 (5)
        • 컴퓨터 네트워크 (6)
        • 운영체제 (1)
      • 솔직 리뷰 (23)
        • 꿀팁 (6)
        • IT기기 (1)
        • 국내 여행 (7)
        • 맛집 (2)
        • 알바 리뷰 (2)
      • 대외활동 (17)
        • 체리피우미 3기 (4)
        • 꿀잠이들 6기 (13)
      • 음식 평가 (1)
      • 일상 & 근황 (2)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩하는_대학생
[JAVA] 인스턴스 변수와 레퍼런스 변수의 차이
상단으로

티스토리툴바