상속
포함관계
클래스 간의 관계 결정하기
단일 상속
다중상속 시 각 각 부모에게 똑같은 메서드가 있을 시 충돌위험 있음
Object 클래스 - 모든 클래스의 조상
오버라이딩
오버라이딩의 조건
오버로딩 vs 오버라이딩 ( 실질적으로는 상관 없음 )
참조변수 super
super()-조상의 생성자
해결법
1. 부모 클래스 ( Point )에 point(){};기본생성자 추가를 해주던가
2. 자식 클래스( Point3D )에서 super(x,y); 조상의 생성자 Point(int x, int, y)를 호출
Point3D(int x, int y, int z) { this.x = x;, this.y = y;, this.z = z; } → Point3D(int x, int y, int z) { super (x.y); this.z; } 변경
패키지
default package : 패키지 선언없는 class 파일들 해당 위치에 속하게 됨
com.codechobo.book : 해당 패키지 선언된 파일들 해당 위치에 속하게 됨
클래스 패스
클래스 패스에 패키지의 루트 입력전에는 패키지의 루트로 이동 후 파일 실행 가능
클래스 패스에 패키지의 루트 입력
클래스 패스에 패키지 루트 입력 후에는 어느 경로에 있든 파일 실행 가능
환경변수 클래스패스값 확인 방법
set classpath
클래스패스 추가 ( jar파일 추가 예시 )
set classpath=C:\java\workspace\ch07\bin;(세미콜론)c;\jdk1.8\work\util.jar
;(세미콜론)으로 구분자를 하면 뒤 경로로 계속 추가 가능
jar파일을 클래스패스에 추가하기 위해서는 경로와 파일명을 적어주어야 한다.
import문
static import문
코드를 간결하게 할라고 사용
하지만 클래스이름이 있으면 명확히 무슨 클래스인지 알수있으므로 되도록이면 클래스이름 사용 권장
제어자
하나의 대상에 여러 제어자를 같이 사용은 가능하나 접근제어자는 하나만 가능
순서는 상관없으나 보통 접근제어자를 맨 왼쪽에 그다음에 static 관례적으로 많이 사용
static - 클래스의, 공통적인
final - 마지막의, 변경될 수 없는
abstract - 추상의, 미완성의
접근 제어자
패키지 1
패키지 2
패키지 1, 패키지 2 구별하면서 접근제한 확인 하기
캡슐화
범위에 있는 값( ex_hour=0~23 )들로 변수들이 유지가 되야 되는데 = 대입연산자로 직접 접근 시 범위 외에 들어 값들을 막을 수 없음 ( public으로 접근제어자를 설정 해두면 외부로 부터 데이터 보호가 안됨 )
해결법 : iv들을 private 접근제어자 설정 ( 외부접근을 막고 ) 메서드를 통한 간접접근만 허용
( if문 사용해서 범위 값 설정 ) 범위 내에 값들만 데이터를 넣을 수 있게 설정
class 내부에서 쓰는 메서드는 public으로 설정 할 필요 없음 private으로 설정
접근제어자는 범위가 좁으면 좁을수록 좋음 필요할때 넓이면 됨
★★★★★다형성(polymorphism) ★★★★★
참조변수의 형변환 ( 1 )
조상 자손 관계 참조변수는 서로 형변환 가능
자손 자손 관계 참조변수는 서로 형변환 불가
참조변수로 사용할 수있는 멤버의 갯수를 조절 ( 리모컨 변경 )
자손타입 <- 조상타입 ( 형변환 생략 불가 ), 5개 <- 4개 (증가) 안전x, 자손 f2 = ( 자손 )c조상;
자손타입 -> 조상타입 ( 형변환 생략 가능 ), 5개 -> 4개 (감소) 안전o, 조상 c = ( 조상 )f2자손;
참조변수의 형변환 ( 2 )
참조변수 타입만 따질게 아니라 참조변수가 가르키는 실제 인스턴스멤버들이 무엇인지 확인하고
실제 인스턴스의 멤버에 개수를 넘으면 안된다.
instanceof 연산자
매개변수의 다형성
해당 이미지처럼 코드 작성 시 다른 메뉴를 구매하고 싶으면 구매하고 싶은 메서드를 다 추가 해줘야 한다.
이 처럼하게 되면 메뉴가 많거나 메뉴가 추가 됫을 경우 하나씩 다 추가를 해줘야하는 번거로움이 있다.
void buy(Tv t) -> void buy(Product p) 자손 클래스를 조상 클래스로 변경
( 해당 메서드 한 줄로 모든 제품 구매 가능 )
다형성으로 인해 조상타입 참조변수로 자손타입 객체를 다룰 수 있음
super(100), super(200) : 조상의 생성자 조상이 초기화 후
class Product 호출 -> Product(int price) super(100)이 들어감,
bonusPoint 계산후 -> Tv1인스턴스 ( price:100, bonusPoint:10 ) 생성
void buy(Product p)로 이동 p(참조변수 0x100)→Tv1인스턴스(0x100)
여러 종류의 객체를 배열로 다루기
다형성의 장점 : 조상타입 참조변수 p로 자손 타입 객체 여러 종류를 다룰 수 있음
Buyer 멤버로 참조변수 cart 추가 Product[10]배열로 설정 각 배열로 구매 가능
i는 배열 번호 ( i=0 이면 cart[0] ) i를 증가시키면서 배열 0~9까지 차곡 차곡 저장
Vector : 가변 배열 가능, 배열의 길이 알아서 조절 , 사용자는 add(newTv()); 로 추가만 해주면 됨
( 11장에서 자세히 설명 )
Object elementData[ ]; : Object[ ] 모든 종류의 객체 저장 가능, 최고 조상이기 때문에
추상 클래스( abstract class )
추상 클래스 = 미완성 설계도 ( 미완성 메서드 포함 )
추상 메서드 = { 몸통 } 없는 메서드
상속을 통해 추상 메서드를 완성 → 완전 클래스( abstract 안붙여줘도 됨 )
추상메서드 2개를 상속 받았는데 1개만 추상메서드를 구현→ 미완성 클래스 ( abstract 붙여줘야 됨 )
나머지 1개는 안보이지만 존재함 하지만 일부분이 구현이 안되있으므로 미완성 클래스
추상 클래스의 작성 ( 1 )
기존 클래스의 공통부분 선언부만 뽑아서 Unit 추상클래스로 정의
int x,y; , void stop() 선언부 모든 클래스에 똑같으니 공통부분으로 빠짐
move(int x, int y) 선언부는 일치하나 각자 움직이는 방식{몸통}이 틀리니 일치 하는 선언부만 뽑아냄
( 해병, 탱크 지상 / 수송선 공중 )
공통부분이 빠져서 코드중복 제거 간결해짐
Unit에 move 버튼이 있으니까 자손 move 선택 가능
for문 내용은 모든 자손 move(100,200) 이동
( 해병, 탱크 지상 / 수송선 공중 ) 각자의 메서드로 이동해야되니 Unit에 move 버튼이 있어야 된다.
Unit 리모콘에는 move버튼이 있으나 Object리모콘에는 move버튼이 없으니 에러
추상 클래스의 작성 ( 2 )
추상클래스( 미완성 설계도 )를 만들어두면 변경이 필요한 부분만 변경 가능
단계별로 미완성설계도를 만들면 변경하고 싶은 부분으로 이동해서 변경 가능
추상화된 코드는 구체화된 코드 보다 변경에 유리하다.
인터페이스의 선언 상속, 구현
동그라미 ( 초록, 빨강, 파랑 ) : iv변수(data)
팔각형 ( 노란색 ) : 메서드
팔각형 껍데기( 사이드 ) : 인터페이스
객체끼리 이동할때는 메서드를 이용해서 접근
인터페이스 : 핵심은 추상 메서드의 집합
추상클래스와 인터페이스 차이
추상 클래스 : 일반클래스인데 추상메서드를 가지고 있는거, 생성자, iv멤버변수를 가질 수 있다.
인터페이스 : 추상 메서드만 가지고 있고 그외 나머지 것들은 부수적인것, 구현된게 아무것도 없는 것
final 상수만 됨 ( 변수, iv, cv 안됨 )
모든 멤버가 public
모든 메서드가 추상메서드 ( abstract )
그러기 때문에 항상 final, public, abstract는 전부 생략 가능 ( 작성 안해도 됨 ) 예외 없음
인터페이스의 상속
인터페이스는 추상메서드의 집합이기 때문에 { 내용 } 이 없으므로 충돌문제 없음 다중상속 가능
인터페이스의 구현
implements ( 구현 ) : 인터페이스의 추상메서드 몸통{ } 만들기 ( 미완성 설계도 완성하기 )
인터페이스를 구현한다는 것은 추상 메서드를 완성하는 것과 동일
차이점은 extends 키워드말고 implements 사용
인터페이스를 이용한 다형성
인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능 ex)Fighter만 가능
인터페이스를 메서드의 리턴 타입으로 지정할 수 있다. ex)Fighter만 가능
인터페이스의 장점 ( 1 )
B에 인터페이스 X : A -> B 강한결합 상태, B를 C로 변경할라고 하면 A도 변경이 생김
B에 인터페이스 O : A -> B 느슨한결합 상태, B를 C로 변경할라고 하면 B만 변경, A는 변경 X
인터페이스의 장점 ( 2 )
인터페이스는 어떤 상속구조에 있어도 구현 가능 ( 인터페이스는 다중 상속 가능 )
SCV, Tank, Dropship을 Repairable에 구현 ( 공통점 생김 ) Repairable에 자손이 됨
메서드 호출 ( 매개변수Repairable ) Repairable을 구현한 클래스의 객체만 가능
디폴트 메서드와 static 메서드
'Java' 카테고리의 다른 글
예외 처리 (0) | 2023.04.03 |
---|---|
내부클래스, 익명클래스 (0) | 2023.03.30 |
객체지향 프로그래밍 I (0) | 2023.03.15 |
배열 (0) | 2023.03.08 |
조건문과 반복문 (0) | 2023.03.03 |