꾸준한 스터디
article thumbnail

중첩클래스 : 클래스에 필드와 메서드 처럼 클래스 내부에 정의된 클래스. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다.

중첩 클래스의 종류는 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스로 네 가지다.

정적 멤버 클래스를 제외한 3가지는 내부 클래스(inner class)에 해당한다.

 

멤버 클래스란 클래스의 구성요소가 되는 중첩클래스로 메서드 내부에 선언된 클래스는 멤버 클래스가 아니다.

지역변수 전역변수 중 전역변수는 클래스 내부 전체에서 쓰이는 멤버 변수인 것처럼 익명 클래스와 지역 클래스는 scope가 전역이 아닌, 사용하는 곳에 한정되고 클래스의 전역에서 사용할 수 있는 것은 정적 멤버 클래스와 비정적 멤버 클래스 뿐이다. 익명 클래스와 지역 클래스는 멤버 클래스가 아니다.

 

  • 정적 멤버 클래스
    • 바깥 클래스의 private 멤버에 접근할 수 있는 점만 제외하고 일반 클래스와 똑같다.
    • 정적 멤버 클래스의 접근제어자가 private라면 다른 클래스에서는 접근할 수 없고 바깥 클래스에서만 접근 가능하다.
    • 바깥 클래스와 함께 쓰일때만 유용한 public 도우미 클래스 예)Calculator.Operation.PLUS
    • 개념상 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다.
    • 바깥 클래스와 아무런 연관관계가 없다면 중첩 클래스로 선언할 이유가 없이 톱레벨 클래스로 별도로 정의하는 것이 좋다.
    • 멤버 클래스에서 바깥 인스턴스를 참조할 필요가 없다면 무조건 정적 멤버 클래스로 만들자.
  • 비정적 멤버 클래스
    • 바깥 클래스의 인스턴스와 암묵적으로 연결된다.
    • 비정적 멤버 클래스의 인스턴스 메서드에서 this를 사용해 바깥 인스턴스의 메서드를 호출하거나 바깥 인스턴스의 참조를 가져올 수 있다.
    • 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 어댑터를 정의할 때 자주 쓰인다.
    • 바깥 인스턴스 없이 생성할 수 없다.
  • 익명 클래스
    • 바깥 클래스의 멤버가 아니며, 쓰이는 시점과 동시에 인스턴스가 만들어진다.
    • 비정적인 문맥에서 사용될 때만 바깥 클래스의 인스턴스를 참조할 수 있다.
    • 자바의 람다를 지원하기 전에 즉석에서 작은 함수 객체나 처리 객체를 만들 때 사용했다.
    • 정적 팩터리 메서드를 만들 때 사용할 수도 있다.
  • 지역 클래스
    • 가장 드물게 사용된다.
    • 지역 변수를 선언하는 곳이면 어디든 지역 클래스를 정의해 사용할 수 있다.
    • 가독성을 위해 짧게 작성해야 한다.

 

static member class

  • Outterclass의 InnerClass는 정적 멤버 클래스이다. 정의되어 있는 범위가 클래스 레벨에 정의되어 있다. 
  • 정적 멤버 클래스는 바깥 클래스(OutterClass)의 static 필드(number)에 접근할 수 있다.
  • 바깥 클래스의 인스턴스를 필요하지 않는다. 바깥 클래스에 독립적이다. static으로 자바가 실행될 떄 먼저 static 메모리에 생성되기 때문
  • OutterClass와 함께 쓰일 때 유용하다. 독립적으로 쓰이기 보다 OutterClass를 거쳐서 쓰일 때 유용하다.

 

member class

  • 비정적 클래스는 static이 없는 멤버 클래스
  • 바깥 클래스(OutterClass)에 대한 인스턴스 참조가 생긴다. 
  • 바깥 클래스 없이는 자기 자신을 생성할 수 없다.
  • new OutterClass().new InnerClass();로 생성하는 방법은 드물고 바깥 클래스 메서드에서 비정적 클래스를 생성하여 사용하는 경우가 많다.
  • 비정적 클래스도 바깥 클래스의 멤버 요소인 필드나 메서드에 접근하여 사용할 수 있다.

이렇게 바깥 클래스의 요소들을 딱히 사용하지 않는 OutterClass 인스턴스가 만들어질 필요 없는 중첩 클래스라면 시간적으로나 공간적으로나 비효율적이다. 비정적 클래스보다 정적 클래스로 선언하여 독립적으로 사용해야 한다. 

 

annonynous class

  • 클래스 이름이 없는 정의하자마자 인스턴스로 만들어지는 클래스
  • 람다가 추가되기 전 많이 사용했지만 이제는 메서드 래퍼런스로 많이 교체됨

 

local class

  • 가장 안쓰이는 로컬 클래스
  • MyClass의 멤버는 number와 doSomething 메서드이지 LocalClass가 아니다.
  • LocalClass는 doSomething 메서드의 지역 클래스

 

 

 

어댑터 패턴

기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴

클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를 재사용할 수 있게 해준다.

 

호환되지 않는 인터페이스를사용하는 클라이언트를 그대로 활용할 수 있다.

이렇게 함으로써 클라이언트와 구현된 인터페이스를 분리시킬 수 있으며, 향후 인터페이스가 바뀌더라도 그 변경 내역은 어댑터에 캡슐화 되기 때문에 클라이언트는 바뀔 필요가 없어진다.

 

  • Client는 Target 인터페이스를 구현한 Adaptee가 필요하다.
  • Adaptee는 Target 인터페이스를 구현하지 않고 있다.
  • Adaptee는 이미 개발이 완료되어 사용중이라 변경하는 것이 적절하지 않은 상황이다.

핸드폰 충전기 중 USB-A 단자로 충전하는 핸드폰 충전 잭이 있다고 가정 할 때 220V에 충전하기 위해 충전 어댑터를 사용하면 전기 코드에 충전할 수 있다. 필요에 따라 충전하는 인터페이스를 바꿔주는 역할을 어댑터가 한다.

 

https://johngrib.github.io/wiki/pattern/adapter/

 

어댑터 패턴 (Adapter Pattern)

서로 일치하지 않는 인터페이스를 가진 클래스를 함께 동작시킨다

johngrib.github.io

https://www.inflearn.com/course/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-2/dashboard

 

이펙티브 자바 완벽 공략 2부 - 인프런 | 강의

자바 학습의 끝판왕 “이펙티브 자바”를 보다 쉽고 완벽하게 학습하세요. 이 강의를 수강하시면 여러분의 자바 프로그래밍 지식과 실력뿐 아니라 학습 능력 또한 향상시킬 수 있습니다., - 강

www.inflearn.com

 

profile

꾸준한 스터디

@StudyRecord

포스팅이 유익하셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!