14Days) 객체지향 프로그래밍 심화(2) - 다형성과 추상화

nacSeo (낙서)·2022년 11월 8일
0

◉ 학습목표

1. 다형성에 대하여 이해하고 활용할 수 있다.
2. 추상화에 대하여 이해하고 활용할 수 있다.
  1. 다형성

⦿ 학습내용

☞ 다형성

✔︎ 다형성(polymorphism) : 상위 클래스 타입의 참조변수를 통해 하위 클래스의 객체를 참조할 수 있도록 허용한 것
✔︎ 참조변수가 사용할 수 있는 멤버의 수 = 상위 클래스의 멤버의 수
✔︎ 다형성의 장점 : 많은 중복된 코드를 줄이고, 보다 편리하게 코드를 작성할 수 있음!

☞ 참조변수의 타입 변환

✔︎ 참조변수의 타입 변환 : 사용할 수 있는 멤버의 개수를 조절하는 것
✔︎ 타입 변환을 위한 세 가지 조건
① 서로 상속관계에 있는 상위-하위 클래스 사이에서만 변환 가능
② 업캐스팅 : 하위 클래스 타입 → 상위 클래스 타입으로의 변환은 형변환 연산자(( )) 생략 ⭕️
③ 다운캐스팅 : 상위 클래스 타입 → 하위 클래스 타입으로의 변환은 형변환 연산자(( )) 생략 ❌

☞ instanceof 연산자

✔︎ instanceof 연산자 : 캐스팅이 가능한 지 여부를 boolean 타입으로 확인
✔︎ 기본 문법

참조_변수 instanceof 타입

✔︎ true : 참조변수가 검사한 타입으로 타입 변환 ⭕️
✔︎ false : 참조변수가 검사한 타입으로 타입 변환 ❌, 참조변수가 null인 경우

  1. 추상화

⦿ 학습내용

☞ 추상화

✔︎ 추상화 : 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
✔︎ 추상화의 장점
✓ 코드의 중복을 줄일 수 있음
✓ 보다 효과적으로 클래스 간의 설정 가능
✓ 유지/보수가 용이
✔︎ 주로 추상 클래스인터페이스로 추상화 구현

☞ abstract 제어자

✔︎ abstract : '미완성' 내포, 주로 클래스와 메서드를 형용하는 키워드

abstract class AbstractExample {	// 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
	abstract void hello();	// 메서드 바디가 없는 추상 메서드
}

✔︎ 추상 메서드(abstract method) : 충분히 구체화되지 않은 '미완성 메서드'
✔︎ 추상 클래스 (아래 설명)

☞ 추상 클래스

✔︎ 추상 클래스(abstract class)
✓ 메서드 시그니처만 존재하고 바디가 선언되어있지 않은 추상 메서드를 포함하는 '미완성 클래스'
✓ 미완성 바디가 완성될 때까지 객체 생성 ❌
✔︎ 추상 클래스의 장점
✓ 상속 관계에 있어 새로운 클래스를 작성하는 데 매우 유용
✓ 선언부만 작성하고, 실제 구체적인 내용은 상속받는 하위 클래스에 구현하도록 비워두도록 설계하여 상황이 변하더라도 유연하게 대응
오버라이딩 사용 : 각각 상황에 맞는 메서드 구현 ⭕️
✓ 추상화를 구현하는 데 핵심적인 역할 수행
✔︎ 상속계층도 상층부에 위치할수록 추상화의 정도 ↑, 아래로 내려갈수록 구체화
: 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의되어 있음

☞ final 키워드

✔︎ final : 더 이상 변경이 불가하거나 확장되지 않는 성질 추가!
✔︎ 필드(변수), 지역변수(메서드), 클래스 앞에 위치할 수 있으며 이에 따라 의미가 조금씩 달라짐!

☞ 인터페이스

✔︎ 인터페이스(interface) : 기능이 가지는 역할과 구현을 분리시켜 코드 변경의 번거로움을 최소화하고 손쉽게 해당 기능을 사용할 수 있도록 하는 것
✔︎ 인터페이스 vs 추상 클래스
① 인터페이스
✓ 추상 클래스에 비해 더 높은 추상성을 가짐
'추상 메서드의 집합' : 기본적으로 추성 메서드와 상수만을 멤버로 가질 수 있음
② 추상 클래스
✓ 메서드 바디가 없는 추상 메서드를 하나 이상 포함한다는 점 외에는 기본 일반 클래스와 동일
✔︎ 인터페이스 기본 구조
interface 키워드 사용
✓ 내부 모든 필드가 public static final로 정의
staticdefault메서드 이외 모든 메서드가 public abstract로 정의

public interface InterfaceExample {
	public static final int lose = 1;	// 인터페이스 인스턴스 변수 정의
    final int draw = 2;	// public static 생략
    static int win = 3;
    
    public abstract String gameScore();
    	void call()	// public abstract 생략
}
// 상수는 반드시 public static final로,
// 메서드는 반드시 public abstract로 정의되어야 하지만
// 일부분 또는 전부 생략 가능 : 컴파일러가 생략된 부분을 자동으로 추가해줌

✔︎ 인터페이스의 구현
✓ 추상 클래스와 마찬가지로 자체 인스턴스를 생성할 수 없고, 메서드 바디를 정의하는 클래스를 따로 작성해야 함
implements 키워드 사용

class 클래스명 implements 인터페이스명 {
	...	// 인터페이스에 정의된 모든 추상메서드 구현
}

✓ 해당 인터페이스에 정의된 모든 추상 메서드를 구현해줘야 함
✓ 클래스에게 인터페이스의 추상 메서드를 반드시 구현하도록 강제하는 것
✓ 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다는 의미
✔︎ 인터페이스의 다중 구현
✓ 클래스 간 단일 상속만 가능한 상속과 달리 인터페이스는 다중적 구현이 가능
✓ 미완성된 멤버를 가지고 있기 때문에 충돌이 발생할 여지가 없어 안전하게 다중 구현 가능
✔︎ 인터페이스의 장점
① 역할과 구현을 분리시켜 사용자 입장에서 복잡한 구현의 내용 또는 변경과 상관없이 해당 기능을 사용할 수 있음
② 클래스의 내용 변경 또는 교체가 발생하더라도, 클래스 코드를 일일이 변경해주어야 할 필요 ❌
③ 개발자 입장에서 선언과 구현을 분리시켜 개발시간 단축 ⭕️
④ 독립적인 프로그래밍을 통해 한 클래스 변경이 다른 클래스에 미치는 영향 최소화

◉ 느낀 점

☞ 쉽지 않다,, 어렵다 ... 너무 어렵다 ..... 🤯🤯🤯 객체지향 프로그래밍이 이렇게 어려울 줄이야 😵‍💫 실시간 세션을 들으면서 이해는 하며 따라가도 직접 내가 혼자서 저렇게 구현해낼 수 있을까 라고 생각이 매초마다 든다.. 🥲 계속 혼자서 해보려 했지만 실패를 맛보고 ,, 그치만 계속 반복적으로 연습을 해야 내 것이 될 것 같다.
앞서 실시간 세션을 들으면서 이해가 간다고 했는데, 실은 나 혼자 구현해내고 설명할 수 없다면 완벽히 이해한 것이 아닌 것이다...! 비온 뒤 땅이 굳어지듯 계속적인 반복학습을 통해 정말 단단히 만들고 가야할 내용들이다. 노력, 노력, 노력...!! 내일 혼자 하루종일 실습과제 만드는 것이 예정되어 있는데 더할 나위없이 중요한 시간들이다. 알차게 임해서 더 성장해가자!!!!!🔥🔥🔥

◉ 내일의 키워드

・ 객체지향 프로그래밍 실습
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글