이 영역을 누르면 첫 페이지로 이동
butter_shower 블로그의 첫 페이지로 이동

butter_shower

페이지 맨 위로 올라가기

butter_shower

[Java] 중첩 클래스와 람다식

  • 2019.12.11 22:36
  • Computer Engineering/Java
글 작성자: _rian

contents
1. 내부 클래스와 내부 인터페이스
2. 무명 클래스
3. 람다식

중첩 클래스와 중첩 인터페이스

중첩 클래스

클래스 멤버로 선언된 클래스

class ClassName{
    class NestedClassName{             //중첩 클래스
    }
}

중첩 인터페이스

  • 클래서 멤버로 선언된 인터페이스
  • 그래픽 프로그래밍에서 이벤츠 처리할 때 자주 활용
class ClassName{
    interface NestedInterfaceName{        //중첩 인터페이스
    }
}

중첩 클래스나 중첩 인터페이스의 특징

  • 중첩 클래스(nested class)나 중첩 인터페이스(nested interface)는 외부로부터 스스로를 감추며, 외부 클래스와 밀접한 관계를 가짐.
  • 중첩 클래스는 외부 클래스(outer class)의 private 멤버를 비롯해 모든 멤버에게 자유롭게 접근 가능
  • 따라서 일반적으로 프로그램을 유지, 보수하기가 쉽고 프로그램이 간단해지지만 중첩 클래스가 복잡할 경우 가독성 저하

중첩 클래스 종류

클래스 생성 시 바이트 코드가 따로 생성된다.

중첩 클래스 및 중첩 인터페이스 구조

일반적으로 인스턴스 멤버 클래스를 내부 클래스(inner class)라 부른다.

컴파일 결과 파일

  • 중첩 클래스와 중첩 인터페이스도 컴파일하면 별도의 바이트 코드 파일 생성
  • 외부 클래스 이름, 달러 기호($), 숫자, 중첩클래스 이름과 연결하여 만들어짐.

내부 클래스가 외부 클래스를 참조하려면

외부클래스.this

멤버 클래스의 객체 생성

외부클래스.인스턴스멤버클래스 변수 = 외부클래스의객체변수.new 인스턴스멤버생성자();
외부클래스.정적멤버클래스 면수 = new 외부클래스.정적멤버클레스생성자();

인스턴스 멤버 클래스

정적 멤버 클래스

지역 클래스


무명 클래스

  • 한번만 사용하기 때문에 이름이 없는 클래스
  • 단독 생성 불가 : 클래스 상속하거나 인터페이스 구현해야만 생성 가능

무명 클래스 예제

//부모로 사용할 샘플 클래스
public class Bird{
    public void move(){
        System.out.println("새가 움직인다~~");
    }
}

public class Anonymous1Demo{
    Bird e = new Bird() {
        public void move() {
            System.out.println("독수리 난다~~~");
        }

        public void sound() {
            System.out.println("휘익~~");
           }
    }

    public static void main(String[] args){
        Anonymous1Demo a = new Anonymous1Demo();
        a.e.move();
        a.e.sound();
    }
}

무명 멤버 클래스에 새롭게 정의된 필드와 메소드

  • 무명 멤버 클래스 내부에서만 사용
  • 외부에서는 무명 객체의 필드와 메소드에 접근할 수 있음
  • 무명 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용 가능

람다식

정렬 메서드의 인수로 코드블록이나 메서드를 사용할 수 있다면....

람다식의 의미

하나의 코드 블록만 정의할 수 있기 때문에 모든 인터페이스의 구현 객체를 람다식으로 표현할 수 없음

단지 1개의 추상 메소드로 구성된 인터페이스 구현 객체만 람다식으로 표현 가능 => 이 인터페이스를 함수형 인터페이스라고 함.

  • JDK 8부터 도입한 함수형 프로그래밍 기법 중 하나
  • 자바는 무명 구현 객체 대신에 람다식을 메서드의 인수로 사용하도록 허용
  • 람다식은 메서드를 감싼 무명 구현 객체를 자바가 전달할 수 있는 코드 블록처럼 흉내낸 것
  • 자바는 무명 구현 객체를 람다식으로 표현해 함수형 프로그래밍을 모방한 것
  • 람다식을 사용하면 무명 객체보다 프로그램의 간결성 및 가독성 향상

형식

  • 매개변수 타입 생략 가능
  • 매개변수가 하나 있다면 괄호를 생략 가능, 없으면 괄호가 꼭 필요
  • 실행문이 하나라면 중괄호와 세미콜론을 생략 가능. 단, 실행문이 return 문이면 return 키워드도 생략
  • 반환 타입을 표현하지 않음

다양한 방식의 람다식 표현 예

//함수형 인터페이스
interface Negative{
    int neg(int x);
}

public class Lambda2Demo{
    public static void main(String[] args){
        // 모두 동일한 의미의 람다식 표현
        Negative n;
        n = (int x) -> {return -x;);
        n = (x) -> {return -x;};
        n = x -> {return -x;};
        n = (int x) -> -x;
        n = (x) -> -x;
        n = x -> -x;
    }
}

 

메서드 참조

  • 전달할 동작을 수행하는 메서드가 이미 정의된 경우에 표현할 수 있는 람다식의 축약형
  • 람다식에 아직 남아있는 불필요한 정보까지 없애기 때문에 람다식에 비해 더욱 간결하고 가독성 제고

 

람다식과 대응하는 메서드 참조

종류 람다식 메서드 참조
정적 메서드 참조 (a) -> ClassName.staticMethod(a) ClassName::staticMethod
인스턴스 메서드 참조 (a, b) -> a.instanceMethod(b)
(단, a는 ClassName 타입이다.)
ClassName::instanceMethod
(a) -> obj.instanceMethod(a) obj::instanceMethod
생성자 참조 (a) -> new Constructor(a) Constructor::new
배열 생성자 참조 (a) -> new Type[a] Type::new

 

메서드 참조 활용

'Computer Engineering > Java' 카테고리의 다른 글

[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map  (0) 2019.12.16
[Java] 제네릭 프로그래밍  (0) 2019.12.16
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류  (0) 2019.12.15
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends  (0) 2019.12.11
[Java] 추상클래스와 인터페이스  (0) 2019.11.22

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Java] 제네릭 프로그래밍

    [Java] 제네릭 프로그래밍

    2019.12.16
  • [Java] 예외처리 - try~catch 문, throws문, 예외의 종류

    [Java] 예외처리 - try~catch 문, throws문, 예외의 종류

    2019.12.15
  • [Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends

    [Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends

    2019.12.11
  • [Java] 추상클래스와 인터페이스

    [Java] 추상클래스와 인터페이스

    2019.11.22
다른 글 더 둘러보기

정보

butter_shower 블로그의 첫 페이지로 이동

butter_shower

  • butter_shower의 첫 페이지로 이동

검색

메뉴

  • All Categories
  • About Me
  • Guest Book

카테고리

  • 전체보기 (223)
    • 💫 주인장 이야기 (17)
    • 🌱 와글와글뻘글 (27)
    • IT Trends (11)
    • 주인장 일상 (0)
    • 📒 내 마음대로 독서 서평 (12)
    • 머신러닝 꿈나무 (30)
      • 기본 개념 (6)
      • Hands-on! (5)
      • Paper Review (5)
      • 캐린이의 Kaggle (1)
    • 알고리즘 Algorithm (33)
      • PS (8)
    • Computer Engineering (75)
      • Python (8)
      • Cloud Computing (9)
      • C (9)
      • C++ (0)
      • Java (6)
      • Django 장고 (4)
      • 임베디드 시스템 (10)
      • 병렬 처리(Parallel Processing) (9)
      • 데이터 통신 Data communication (4)
      • 유닉스 시스템 (Unix System) (3)
      • GitHub (1)
      • 마이크로 프로세서 (micro processor) (1)
      • 데이터 마이닝 (1)
    • Error Note 🚨 (3)
    • 영어 공부 (6)
      • Live Academy (6)
    • HOBBY (2)
      • Film Log (2)

최근 글

정보

_rian의 butter_shower

butter_shower

_rian

나의 외부 링크

  • Github
  • Facebook
  • Instagram
  • LinkedIn
  • Twitter

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © _rian. Designed by Fraccino.

티스토리툴바