일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자바스크립트
- 스프링
- kubernetes
- 스프링핵심원리
- effectivejava
- 카카오
- Sort
- Spring
- 김영한
- 스프링부트
- 자바
- 이펙티브자바
- 엘라스틱서치
- k8s
- 코딩테스트
- ElasticSearch
- JavaScript
- Effective Java
- Effective Java 3
- 오블완
- 예제로 배우는 스프링 입문
- 티스토리챌린지
- 알고리즘
- 알고리즘정렬
- java
- 클린아키텍처
- 카카오 면접
- 스프링 핵심원리
- 이차전지관련주
- 이펙티브 자바
- Today
- Total
Kim-Baek 개발자 이야기
자바 기본 (17) - 추상, 인터페이스 본문
예전에 자바를 처음 공부하던 때, 네이버 블로그에 정리한 내용을 이제 티스토리로 옮기고자 한다
◎ abstract
- 메소드와 class 에 붙는 제한자 (modifier)
- 추상의 , 구현되지 않은 이라는 의미
ex) public abstract class A { } <- 구현이 덜 된 애
public abstract void go( ) { }
※ 왜 abstract 가 나오게 된 것일까?
다형성과 오버라이딩 때문이다.
Animal 에 있는 eat 메소드의 경우 상속받는 모든 클래스에 공통적으로 적용되는 내용이기 때문에 추상적일 수 밖에는 없다. Dog 타입의 d.eat()를 하게 되면 Animal eat()가 불리는 것이 그 예시로 볼 수 있다.
-> 이렇게 추상적인 클래스의 경우 하위클래스에서 재정의 (오버라이딩) 해야하는데 이는 강제가 아니다.
-> 다른메소드를 만들 수도 있고, 안만들 수도 있고 자기 마음대로 하게된다.
=> 이것을 강제하는 것이 abstract 메소드이다
※ Animal 의 경우 타입으로는 많이 쓰인다. 하지만 실제 new Animal 로 객체를 생성해서 쓸일은 많이 없다
ex) 동물원에서 개 , 고양이 객체를 생성하지 동물객체를 생성하지는 않는다.
=> 부모클래스는 상속받는 클래스가 어떤일을 할지만 선언해주자 : abstract 클래스
◎ abstract 메소드
- 선언만 하는 메소드 : 구현은 하지 않는다.
ex) public abstract void go(); <-- 만약 여기에 { } 중괄호가 들어가면 내용을 구현한것이다!(아무일도 하지마라라는 의미)
-> 하위 class 에서 overriding 하도록 강제하는 메소드이다(반드시 해야함!) => 구문을 통일시킨다.
class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat() <---- 먹다라는 기능을 가져야 하는데 이름 : eat , 리턴 : void, 파라미터 : x 로 강제한다.
{
//내용 구현
}
}
◎ abstract class
- 객체 (instance ) 생성을 못하는 class 가 된다.
- 역할 : 상속용 class -> super class
ex) public abstract class A{
<-- new A 불가능
}
-> abstract 메소드를 가지는 class는 반드시 abstract class가 되야한다.
-> 상속후 추상메소드를 overriding 하지 않으면 상속받은 class 도 abstract class가 되야한다. (overriding을 강제하게 된다)
-> 일반 class 구성요소 + 추상 메소드 : 추상 class
◎ UML 에서의 표기
class 명과 메소드 명이 Italic 체로 표기된다
※ abstract vs final
class 객체생성X->상속 상속 X
메소드 오버라이딩 해라 오버라이딩 X
변수 X 상수 (변수의 경우 public static 으로 같이 많이 사용된다)
◎ Interface
- 하위 class 들이 type 역할을 하는 구조
-> [ public abstract ] 메소드
[ public static final ] 상수 이 둘만 가질수 있다. (앞의 제한자는 무조건 붙어야하기때문에 생략이 가능하다)
- 구문 : public interface 이름 [ extends 상위 interface 명, ....] {
[public static final] 상수 = 값;
[public abstract] 메소드 ();
} -> 생략을 하게되면 컴파일러가 알아서 넣어준다.
- 이름 : 관례 - class 이름과 동일 -> 단어의 첫글자가 대문자
- extends : 다른 interface를 상속하는 경우 추가 -> 다중상속지원
※ UML 에서의 표기
-> public interface Shape{
public int calculateArea();
}
※ class 의 interface 상속
[ 제한자 ] class 이름 [ extends SuperClass 이름 ] [ implements 상위 interface 이름, ... ]
->class 가 class 상속 (단일상속) -> class 가 interface 상속 -> 다중상속
ex) public class sub extends C implements I1, I2, I3, I4 { }
단일상속 다중상속
-> Sub 객체의 type : Sub, C, Object, I1, I2, I3, I4
※ Interface 역할
1. (상위) Type 으로서의 역할 : implements 할 하위 class들이 구현해야 하는 메소드구문 통일
: implements 할 하위 class들의 공통타입이 된다.
=> 추상클래스와 동일
2. 다중상속
=> 큰 연관성 없는 class 들을 동일 Type으로 묶을 수 있다.
※ 왜 인터페이스는 다중상속이 될까?
클래스 상속은 똑같은 이름으로 구현된 메소드를 상속받았을 때, 어떤것을 할줄 모르게된다.
interface는 그렇지 않다. 똑같은 이름을 받더라도 구문만 제공하는 것이고 하위클래스에서 재 정의를 할 것이기 때문에 상관없다(이 클래스의 것을 쓸것이다)
※ 이클립스의 기능
- source -> override/implement methods 기본적으로 abstract는 체크가된다
- 클래스 생성시 interface 창에 add 하면 implement 할 인터페이스 추가가능
'개발 > java basic' 카테고리의 다른 글
자바에서 코틀린 - 5장 빈에서 값으로 (0) | 2023.04.13 |
---|---|
자바 기본 ( 18 ) - 예외처리 (0) | 2020.11.03 |
자바 기본 (16) - 상속, 다형성 (0) | 2020.10.07 |
자바 기본 (15) - 의존 관계, is a, has a (0) | 2020.10.06 |
자바 기본 (14) - static, 싱글톤 (0) | 2020.10.05 |