티스토리 뷰

■ 추상 클래스 설명
클래스가 추상적이라는 말이 아님
원래 모든 클래스가 추상적임
클래스 안에 선언한 필드 중에서 추상적인 개념이 있다는 뜻
추상 메소드를 선언할 수 있는 클래스

클래스 선언하면 그 안에 필드가
구현이 안되어있는 메소드 >> 추상 메소드 >> {}가 없다는 뜻

메소드를 선언할 때 구현이 되어 있으면 {}
{}가 비어있어도 구현된 것
실무에서는 {}를 '바디'라고 칭함

반드시 재정의해야 하는 메소드는 추상 메소드
상속받으면 무조건 오류 >> 재정의하라고 강제성 부여

■ 추상 클래스
필드 안에 구현이 안 된 메소드(바디가 없음)가 선언되어 있는 클래스를 추상클래스라고 한다.
이 때 구현되지 않은 메소드를 추상 메소드라고 부른다.
반드시 재정의를 통해 구현을 해야지만 메모리에 할당되기 때문에
"강제성"을 부여하기 위해서 추상 메소드로 선언한다.

■ 추상 클래스 선언
abstract class 클래스명{
리턴타입 메소드명(매개변수,...){} <<일반 메소드
abstract 리턴타입 메소드명(매개변수,...); <<추상 메소드
일반 메소드도 선언 가능
}


수정을 한 후 저장을 해야 반영이 됨

(패키지 : abstractTest)
단축키
저장 ctrl+s
전체저장 ctrl+shift+s
이름바꾸기 alt+shit+r(rename)
------------------------------------------------------

■ 인터페이스(interface) : 틀
상수, 추상메소드만 가능 >> 무조건 구현할 거라는 얘기
: 추상 클래스를 고도화시킨 문법
: 상수와 추상메소드만 존재한다.
: 구현은 인터페이스를 지정한 클래스에서 진행하고,
: 인터페이스를 다른 클래스에 지정할 때에는 implements 키워드를 사용한다.


인터페이스의 추상 메소드의 
강제성을 없애기 위해서 / 강제성을 조율하기 위해서
추상 클래스(어댑터)를 만들어줌
어댑터를 상속받아서 메소드를 골라서 쓰기

■ 추상 클래스와 인터페이스 간의 관계
인터페이스를 클래스에 바로 지정하면 모든 메소드에 강제성이 부여되어서
전부 다 구현해야 한다. 하지만 일반적인 상황에서는 모든 것이 아닌,
필요한 메소드를 골라서 재정의해야한다.
인터페이스를 직접 지정하지 않고 다른 클래스에 지정한 후 바디를 만들어 놓는다면,
강제성이 소멸되고 이 클래스를 상속받아서 필드를 구현한다면, 골라서 재정의할 수 있게 된다.
이 때 중간에서 강제성을 없애주는 클래스를 추상클래스로 선언하기로 하며,
추상 클래스 이름 뒤에는 Adapter를 붙여서 목적을 알려준다.
------------------------------------------------------
■ 마커 인터페이스(Marker Interface)
클래스들을 그룹화하기 위한 목적으로 사용한다.
인터페이스는 지정한 클래스의 부모이며, 모든 자식은 부모의 타입이므로
마커 인터페이스를 지정받은 클래스들이 하나의 타입으로 묶이게 된다.
이름 뒤에 Marker를 붙여줘야 한다.


1.인터페이스도 타입이다
2.인터페이스가 틀을 주는 거다 >> 인터페이스는 부모다
(패키지 : interfaceTest)

------------------------------------------------------
■ 내부 클래스(Inner Class)
하나의 클래스에서 a작업과 b작업이 있을 때에는 따로 분리하여 클래스로 만들지 않고,
클래스 안에 클래스를 선언하여 설계한다. 이 때 밖에 있는 클래스를 외부 클래스라고 하며,
안에 선언된 클래스를 내부 클래스라고 한다. 외부 클래스가 메모리에 할당되어야
내부 클래스를 객체화할 수 있기 때문에 클래스를 숨기기 위해서 내부 클래스를 사용하기도 하며,
이를 캡슐화 또는 은닉화라고 한다. 내부 클래스는 외부 클래스의 필드이기 때문에
외부 클래스의 필드를 자신의 필드처럼 가져다 사용할 수 있게 된다.
※ 메소드 안에서 클래스를 선언할 수도 있다.
장점 : 상속을 할 필요가 없다


메소드 안에 메소드X
클래스 안에 클래스(주문(외부클래스) 안에 배송(내부클래스))
같은 필드면 메소드 같이 쓸 수 있음
내부클래스를 extends 하지 않아도 됨
{
{} >> 내부클래스
}
상속 개념x 동일한 필드o
어떤 영역 안에서도 클래스를 선언할 수 있다(클래스 영역, 메소드 영역 다 가능)


■ 캡슐화 : 밖에서 따로 단독으로 쓰이지 않게끔 숨겨 놓는 것


■익명 클래스(Anonymous Inner Class)
이름이 없는 클래스이며 구현되지 않은 필드를 구현하기 위해 일회성으로 생성되는 클래스이다.

(패키지 : anonymousTask)
------------------------------------------------------
PM
(클래스 : GuiTest)

인터페이스는 여러개 implement 가능
인터페이스에서 구현가능한 메소드 > default메소드 선언가능 > 다중상속이 가능한거나 마찬가지이지만
JAVA는 다중상속이 지원 안됨이 원칙


■다중상속
여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.
JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.
하지만 JDK8버전부터는 인터페이스에 default 메소드 선언을 허용하며,
여러 개를 지정할 수 있는 인터페이스 특성상 다중 상속을 지원하는 것이나 다름이 없다.

■모호성(ambiguity)
하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면,
어떤 부모의 필드인지 알 수가 없다. 이를 모호성이라고 부른다.

■모호성 해결 방법
- 상황1 : 두 개의 인터페이스 내에 이름과 매개변수가 똑같은 메소드가 선언되어 있다.
- 해결1 : 자식 클래스에서 재정의하여 사용한다.
인터페이스명.super 사용

- 상황2 : 부모클래스의 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 똑같이 선언되어 있다.
- 해결2 : 부모클래스의 메소드가 사용된다.

------------------------------------------------------
■인터페이스 쓰는 목적
1.강제성 부여
2.마커, 그룹화
3.함수형

■함수형 인터페이스(Funcional interface)
-> 인터페이스 안에 1개의 추상메소드만 선언
인터페이스 중 추상 메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 한다.
이 때 @FunctionalInterface를 인터페이스 위에 작성하여 단 하나의 추상 메소드만
선언할 수 있도록 제한해야 한다.

구현할 때 열리는 클래스 > 익명클래스

■람다식(익명 메소드) (Lambda Expression)
익명클래스 너무 복잡해! 한줄로 구현해보자 > 람다식(익명메소드)
인터페이스 안에 추상메소드가 1개만 선언되기 때문에 이름이 필요 없음
이름이 없는 메소드로서 변수처럼 사용이 가능하며, 매개변수로도 전달이 가능하다.
함수형 인터페이스는 추상 메소드가 한 개만 선언되기 때문에 메소드 이름이 필요 없다.
따라서 람다식을 익명 메소드(Anonymous Method)라고도 부른다.

■람다식 문법
1. (매개변수 형식 나열,...) -> 리턴값;
ex.(x,y) -> x+y;
2. (매개변수 형식 나열,...) -> {2개 이상의 문장 작성; return 리턴값;}


(패키지 : lambdaTest)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함