///////
Search

다형성,추상클래스,인터페이스

작성 날짜
2022/09/30 07:23
작성자
황시은

다형성의 이해

업캐스팅(상형 형변환)

부모 클래스 변수로 자식 클래스 객체를 참조할 수 있다.
Shape shape = new Circle()
형변환을 진행하지 않으니 캐스팅이 부모쪽으로 맞춰지게 된다.
→ 하위 객체를 상위 클래스형 변수에 대입

다운캐스팅

기본적으로는 안되지만 되는 case가 몇가지 있음.
Shape circleShape = new Circle(10)
Circle circle = (Circle) circleShape
→ 미리 자식으로 메모리에 올라가 있음
Shape shape 에서 1000번지 circle 객체를 담음
즉, 이미 객체가 circle 로 정의되어있음.
즉, 다형성 적용으로 잃어버린 특성을 복구시키기 위해 원래 상태로 되돌리는 것

다형성의 활용

매개 변수에 Shape 타입으로 선언하면 훨씬 넓은 범위의 객체를 받을 수 있다.
ex) void getArea(Shape shape) → Shape shape = new Triangle(10,10)이 되서 결국 위와 동일한 의미

ㄴ instanceof 연산자

객체의 실제 타입을 알고싶으면 사용하는 연산자
객체 instanceof 실제 타입 : obj instanceof Rectanle
return true/false
→ 실질적으로, 캐스팅 가능 여부를 알 수 있다. true 면 가능!
if("kyunghwan" instanceof String) { } // String 타입이므 true // 컴파일 오류! primitive type은 instanceof 적용 불가능!. if(3 instanceof int) { }
Java
복사

추상클래스와 인터페이스

추상클래스

클래스 안에 abstract가 붙은 추상 메소드가 존재하는 클래스.
객체 생성이 안된다.(X)
함수 바디를 구현 하지 않는 추상메소드가 존재.
보통의 메소드도 존재 가능!
자식 클래스에서 추상 메소드를 구현하지 않으면 컴파일 오류가 발생한다.
abstract : 키워드로 사용 할 수 있다.
추상 클래스 내에 추상메소드로 호출 가능하다. → 객체생성이 안되어 자손이 메소드를 완성해야지 객체 생성 할 수 있다. → 이미 자손클래스내부에서 구현된 함수이기에 추상 메소드 선언 가능
abstract class Animal{ public abstract void move(); } class Lion extends Animal{ @Override public void move(){ system.~~~~("움직인당"); } }
Java
복사
→abstract는 자손이 구현하라는 의미!

추상 클래스의 작성

여러 클래스에서공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통부분을 뽑아서 추상클래스를 작성한다.

인터페이스

일종의 추상클래스로, 추상클래스보다는 추상화 정도가 높다. 실제 구현된 것이 없는 기본 설계도로 추상메서드와 상수만을 멤버로 가지고 있다. 추상 메서드와 마찬가지로 인스턴스를 생성할 수 없으며, 클래스 작성에 도움을 주는 목적으로 사용된다.

인터페이스 특징

인터페이스 상속관계가 아닌, 클래스간 유사성을 인코딩
협업관계(외주)의 특효약
interface는 다형성에 도움이 된다.
interface = 약속 = 강제 = 표준
interface는 객체를 생성할 수 없다. but 참조변수 선언까지 가능하다. (다형성 적용)
class 대신 interface를 사용한다.
추상함수만 가질 수 있다. → 일반 메소드가 오면 에러가 발생
추상 메소드가 있으니, 자식이 구현 해야함(대신 키워드는 implements)
컴파일 과정에서 추상메소드는 모두 public abstract 이며 생략해도 컴파일 과정에서 추가 해준다.
모든 멤버변수는 public static final int 이어야 하며, 생략할 수 있다.
interface pritable{ public abstract void print(String doc); } class printerDriver implements printable{ @Override public void print(String doc){ System.out.println("삼성 프린터 입니다."); System.out.println(doc); } }
Java
복사

인터페이스 작성

인터페이스의 구현은 클래스 상속과 같다.
extends 대신 implements를 사용한다.
인터페이스에 정의된 추상메소드를 구현해야한다.
상속과 구현이 동시에 가능하다.
class Fighter extends Unit implements Fightable{}

다중상속?

자바는 다중 상속이 지원 안된다. C++은 지원함.
D가 다중 상속을 받을때, 상속하는 B 와 C의 부모 A에서 B와 C가 오버라이드하고 있을때, D는 B와 C 둘중 어떤 함수를 오버라이드 할지 결정하기 애매해진다.
여러개의 인터페이스를 구현 하면 다중 상속의 효과를 낼 수 있다.

인터페이스를 이용한 다형성

인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다. Fightable f = new Fighter() (부모 = 자식)
인터페이스를 매개변수타입으로 지정할 수 있다.
인터페이스를 메서드의 리턴타입으로 지정 할 수 있다.

인터페이스의 역할

인터페이스는 두 대상(객체) 간의 중간 역할
선언(설계)와 구현을 분리시키는 것을 가능하게 한다.
인터페이스는 클래스를 사용하는 쪽(User)와 클래스를 제공하는 쪽(Provider)가 있고, User에서는 Provider의 선언부만 알면 된다.

Static

변수 종류
1.
인스턴스 변수
2.
static
3.
지역변수

null

1.
가리키는 값이 없다.
2.
GC(가비지 콜렉터)로 하여금 해당 메모리를 회수 해도 좋다는 의미.