Day 18 - 26.09.17

서코딩·2026년 9월 17일

자바

목록 보기
18/19

0. 복습

Set

  • 데이터의 순서를 보장하지 않는다(인덱스 개념 x)
  • 중복을 허용하지 않는다
  • 구현 클래스 : HashSet

Map

  • 데이터의 순서를 보장하지 않는다
  • 데이터를 key와 value 한쌍으로 저장
  • key로 해당 value에 접근할 수 있다
  • 구현 클래스 : HashMap

1. 내부 클래스(Inner Class)

클래스의 멤버 : 필드, 메서드, 클래스(내부 클래스)

  • 내부 클래스 : 클래스 내부에 선언된 클래스
  • 외부 클래스 : 내부 클래스를 가진 클래스
  • 내부클래스로 선언된 클래스는 외부 클래스를 상속받지 않아도 외부 클래스의 멤버들을 사용할 수 있음
  • 내부클래스만으로는 객체화 불가능
  • 외부 클래스를 먼저 객체화해야 내부 클래스 객체 생성 가능

** 내부 클래스는 앱개발에 사용되나 웹개발에서는 많이 쓰이지 않음
=> 익명 클래스에서 내부 클래스 개념이 나오므로 알고 있어야함

1) 내부 클래스의 종류

  • 인스턴스 내부 클래스
  • 스태틱 내부 클래스
  • 로컬 내부 클래스

2. 익명 클래스(Anonymous Class)

  • 이름이 없는 클래스이다
  • 클래스를 선언과 동시에 객체를 생성한다
  • 주로 인터페이스나 추상 클래스의 구현체를 즉석에서 만들기 위해 사용한다.

1) 익명 클래스의 특징

  • 익명 클래스는 이름이 없다
  • 변수, 메서드, 클래스에 이름이 있는 이유는 필요할 때 불러서 사용하겠다
    => 반복적으로 사용
  • 이름이 없다 -> 부를 수 없다 -> 반복 사용 불가능, 일회성 사용만 가능하다

2) 익명 클래스를 사용하는 이유

  • 인터페이스, 추상 클래스는 객체화가 불가능하여 부모로 사용되어야 함
  • 그 말은 자식 클래스를 만들어야한다는 것인데 딱히 재사용할 목적이 없다면 익명 클래스로 만들어 사용함
  • 익명 클래스는 일회성이어서 객체화 시키면 끝임
    -> 쓸데없는 파일이 생기지 않음

3. 함수형 인터페이스(Functional Interface)

  • jdk 8버전에 추가된 내용
  • 추상 메서드가 한 개만 존재하는 인터페이스를 함수형 인터페이스라고 한다
  • 함수형 인터페이스는 @FunctionalInterface 어노테이션을 붙이는게 안전

4. 람다식(Lambda Expression)

  • 함수형 인터페이스와 함께 jdk8부터 도입된 기능
  • 익명 메서드라고도 불린다
  • 함수형 인터페이스를 익명 클래스로 구현하여 메서드를 재정의하는 대신 람다식을 사용하면 문법이 간결하다
  • 함수형 인터페이스를 재정의 할 때만 사용한다 !!

1) 람다식 문법
(1) 람다식의 시그니처는 -> 이다. (-> 있으면 람다식이라는 뜻)
(2) (매개변수) -> {실행할 문장;}

  • 매개변수가 1개인 경우에만 () 생략 가능(0개 또는 2개 이상인 경우 생략 불가)
  • 실행 문장이 1줄인 경우 {} 생략 가능
    (단, 1줄이더라도 return 은 {} 생략 불가)
    (3) 최종 생략시 다음 형태까지 줄일 수 있음
    매개변수 -> 실행문장;

2) 람다식을 만드는 과정
(1) 익명 클래스

FuncInter fi = new FuncInter() {

			@Override
			public void method() {
				System.out.println("익명클래스로 재정의");
			}
		};

(2) 함수형 인터페이스는 익명 클래스를 활용하여 재정의하는데 매번 똑같은 틀을 쓸 필요가 없다.

  • new FuncInter(){}부분을 생략
- 남은 코드
@Override
			public void method() {
				System.out.println("익명클래스로 재정의");
			}

(3) 함수형 인터페이스는 어차피 추상 메서드가 1개이므로 무슨 메서드를 재정의 하는지 알려주지 않아도 된다

  • @Override 생략
  • public void method 선언부 생략
- 남은 코드
() {System.out.println("익명클래스로 재정의");

(4) 람다식의 시그니처는 -> 이다

  • 람다식임을 알리기 위해 매개변수()다음 위치에 -> 추가
- 남은 코드
() -> {System.out.println("익명클래스로 재정의");

(5) 람다식은 코드를 최소화 시키는 목적이 있다.

  • 람다식에서 {} 영역을 람다식의 몸통(body)라고 부른다
  • body에 명령어가 1줄이면 {} 생략이 가능하다(선택사항)
- 남은 코드
() -> System.out.println("익명클래스로 재정의");

(6) 람다식 최종 형태

() -> System.out.println("익명클래스로 재정의");

메서드를 재정의하는 문법을 최소화 시킨 하나의 식이 된다.
메서드 이름이 생략된다(익명 메서드라고 불리는 이유)

3) 자바에서 기본 제공하는 함수형 인터페이스

  • 람다식을 사용하기 위해 매번 새로운 함수형 인터페이스를 만드는 것은 번거롭다
  • 자바에서 기본적인 함수형 인터페이스를 만들어 제공한다

(1) Consumer< T > : void accept(T t)

  • T 타입을 전달받지만 반환하지 않음

(2) Supplier< T > : T get()

  • 매개변수 없고 T타입을 반환

(3) Predicate< T > : boolean test(T t)

  • T 타입을 전달받아 boolean 타입을 반환

(4) Function< T, R > : R apply(T t)

  • T타입을 전달받아 R타입으로 변환하여 반환

(5) UnaryOperator< T > : T apply(T t)

  • T타입을 전달받아 T타입으로 반환
profile
서코딩 127 !

0개의 댓글