6장 객체지향1
oop = 그룹 & 관계 => 변경유리
=> 클래스를 작성하고 클래스 간 관계맺기
객체지향개념 목표 = 프로그램 변경 쉽게
- 코드의 재사용성 높음
- 유지보수가 용이
- 중복코드 제거
객체지향 개념의 4대 원칙
1. 캡슐화 - 접근 제어자로 데이터를 보호. 외부로부터 내부를 감추는 것
2. 상속 - 기존 클래스를 확장해서 새로운 클래스를 작성하는 것
3. 추상화 - 공통점을 뽑아내는 것. 덜구체적으로 만들기.
4. 다형성 - 조상 참조변수로 여러 종류의 자손 객체를 다루게 하는 것
클래스와 객체
클래스: 집합, 그룹, 폴더
- 객체를 정의한 설계도
- 변수+메서드(문장묶음)
- 사용자 지정 타입
객체: 실제로 존재하는 것, 속성과 기능, 멤버(iv)의 집합
객체 생성: 클래스명 참조변수명 = new 클래스명();
객체배열: 참조변수 배열, 타입[ ] 배열이름 = new 타입[n];
객체배열 생성 후 반드시 객체 생성하기
변수의 종류
클래스 영역
- cv: 객체 생성X, 자동생성, 아무때나 사용가능
- iv: 객체 생성O, 객체생성필요, 객체생성해야 사용가능
메서드 영역
- lv: 클래스 이외의 영역, 메서드 종료시 자동제거
iv와 cv
- iv: 인스턴스마다 개별 저장 공간, ex) 숫자, 모양
- cv: 모든 인스턴스가 공유, ex)길이, 폭
지역변수: 매서드 내에서 선언된 변수, 메서드 영역이 서로 다른 지역변수들은 이름이 겹쳐도 상관X
메서드
메서드: 문장묶음, 꼭 클래스안에 있어야 함
- 입력(값)-> [ ] -> 출력(반환값)
- 선언부 + 구현부
장점
- 재사용성
- 중복코드제거
- 프로그램구조화
메서드 실행 흐름
- 객체 생성 -> 메서드 호출 -> 메서드 안 수행문 수행 -> 호출한 곳으로 반환
return 문
- 실행중인 메서드를 종료하고 호출한 곳으로 되돌아감
- void를 제외, 반드시 return문 필요
- 반환값의 데이터 타입 = 메서드 선언부의 반환형
유효성 검사: 입력한 매개변수의 값이 적절한가
기본형 매개변수 & 참조형 매개변수
- 기본형 매개변수: R만 가능
- 참조형 매개변수: R W 가능
참조형 반환타입
- 객체 주소 반환
- 객체 주소를 줬기 때문에 객체를 다룰 수 있음
- 메서드와 반환받는 타입이 참조형으로 일치해야 함
재귀호출: 메서드가 자기 자신을 호출해서 일을 시키는 것
클래스 메서드와 인스턴스 메서드
static 메서드
- 객체 생성 없이 클래스이름.메서드이름()으로 호출
- 인스턴스 멤버(iv,im)와 관련없는 작업
- 메서드 내에서 iv 사용 불가(static 붙여야 함),매개변수로 전달 받음
인스턴스 메서드
- 객체 생성 후 참조변수.메서드이름()으로 호출
- 인스턴스 멤버(iv,im)와 관련된 작업을 하는 메서드
- 매개변수없이 메서드에서 iv 사용가능
static 메서드는 인스턴스 메서드를 호출 X
- static은 iv 사용 불가, 객체가 있을지 없을지 모름
인스턴스 메서드는 static 메서드 호출 O
- 인스턴스 메서드가 호출됐으면 이미 객체 생성(iv가 이미 존재)
오버로딩
: 같은 이름의 메서드를 여러개 정의하는 것
조건
- 메서드 이름이 같아야 한다
- 매개변수의 개수 또는 타입이 달라야 함
- 반환타입 영향 X
ex) println()
생성자
: 인스턴스 초기화 메서드
조건
- 생성자 이름 = 클래스 이름
- 반환타입없음(void 안씀)
- 다른 생성자 호출은 반드시 첫줄에서 해야 함
- 다른 생성자 호출 시 this() 사용
모든 클래스에 생성자가 한개는 있어야 함
기본생성자
클래스이름() {}: 매개변수도 하는 일도 없음, 기본옵션
- 매개변수 없는 생성자
- 생성자가 하나도 없을 때만 컴파일러가 자동추가 해줌
- Card()
매개변수가 있는 생성자
- 인스턴스를 생성하는 동시에 원하는 값으로 초기화 가능
- 이렇게 하는게 코드가 간결해짐
- ex)Card(String k, int num)
생성자 this()
- 생성자에서 같은 클래스의 다른 생성자를 호출할 때, 클래스이름 대신 this 사용
- 다른 생성자 호출 시 첫줄에서만 사용가능
참조변수 this
- iv와 lv 구분, this가 있으면 iv, 없으면 매개변수와 가까운 lv
- 인스턴스 자신을 가르키는 참조변수(객체주소가 저장되어있음)
- 인스턴스 메서드에서만 사용 가능/ static 메서드에서는 사용불가
변수의 초기화
- 멤버변수(iv, cv) : 자동초기화
- 지역변수(lv)는 우리가 수동으로 초기화
멤버변수의 초기화 순서, 시기
1) 자동: 0 (타입의 기본값)
2) 간단: =
3) 복잡: { } ->거의 안씀, static { } -> cv , 생성자( ){ } -> iv
7장 객체지향2
상속
- 기존 클래스가 확장해서 새로운 클래스 작성
- 자손은 조상의 모든멤버를 상속받음(생성자와 초기화 블럭 제외)
- 자손의 변경 => 조상 영향 X
- 자손의 멤버개수는 조상보다 같거나 많다
포함
- 클래스 안에 다른 클래스 타입의 iv를 선언하는 것
- 작은 단위의 클래스를 만들고 이들은 조합해서 클래스 만든다
클래스 간의 관계
- 상속관계
- ~는 ~를 이다(is a)
- extends Point{}
- 포함관계
- ~는 ~를 가지고 있다(has a)
- Point c = new Point();
상속 특징
- 계층 구조 바꾸기 어렵다
- 단일 상속
- 부모를 지정
포함 특징
- 포함이 상속보다 유연- 다형성 때문에
- 다형성을 이용할 수 없기도 함(대신 덕타이핑)
상속은 하나만 하고 나머지는 포함 사용
Object 클래스
- 모든 클래스의 조상
- 조상 클래스 = Object 클래스 상속(컴파일러)
- 모든 클래스 = Object 클래스의 정의된 메서드 상속(ex. toString 등)
오버라이딩
: 조상의 메서드를 자신에게 맞게 새로 작성하는 것
조건
- 선언부가 같아야 함
- 접근제어자를 좁게 X
- 조상보다 예외선언을 많게 X
생성자 super()
- 조상의 생성자 호출
- 조상의 멤버는 조상의 생성자를 호출해서 초기화, 자손의 생성자는 자신이 선언한 변수만 초기화 할 수 있음
- 모든 생성자는 첫 줄에 다른 생성자를 호출해야 함 -> 그렇지 않으면 컴파일러가 super()를 만듦
- 기본생성자 호출x 매개변수가 있는 생성자 호출 ex) super(x,y)
참조변수 super
- 조상멤버와 자신의 멤버 이름 구별
- 객체 자신을 가르티는 참조변수, 인스턴스 메서드(생성자) 내에서만 존재
패키지
- 클래스 묶음, 패키지 안 패키지
- 패키지 = 폴더, 클래스 = 파일
클래스패스: 클래스파일을 찾는 경로
import 문
static import
- static 멤버를 호출할 때 클래스 이름 생략
제어자
: 클래스나 클래스 멤버에 부가적 의미 부여
- 접근제어자: 4개 중 1개만 사용가능
- 그 외
- 제어자 여러개 사용 가능, 접근제어자는 한개만 가능
static: 클래스의, 공통적인
- 멤버변수 - cv
- 메서드 - static 메서드
final: 마지막의, 변경될 수 x
- 클래스: 변경 확장X, 조상클래스 X, 가장 마지막 클래스
- 메서드: 변경X , 오버라이딩X
- 변수(멤버변수, 지역변수): 상수
abstract: 추상의, 미완성의(추상화)
- 클래스: 추상클래스(추상메서드를 포함한 클래스)
- 메서드: 추상 메서드(구현부X)
- 추상클래스 - 인스턴스 생성 불가
🔺추상클래스를 상속받아서 완전한 클래스(설계도)를 만든 후 객체 생성 가능
접근제어자
: 클래스와 클래스의 멤버에 붙이는 형용사, 캡슐화를 가능하게 해주는 중요한 요소
접근제어자 종류
- public: 제한 전혀 없음
- protected: 같은 패키지 + 자손
- (default): 같은 패키지
- private: 같은 클래스
캡슐화 목적
- 데이터 보호
- 불필요한 부분 감추기(복잡도, 의존도를 낮추기)
다형성
- 조상 타입 참조 변수로 자손 타입 객체 다룸
- 하나의 배열에 여러종류 객체 저장
- 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버의 개수보다 적어야 함
- 참조변수 타입과 인스턴스 타입은 보통 일치하지만 일치하지 않을 수 있다
참조변수 형변환
- 멤버의 개수 조절, 값 변경X
- 조상과 자손의 관계에서 형변환 가능
- 리모컨 기능이 많은 쪽에서 적은 쪽으로 줄이는건 안전, 자손 -> 조상⭕
- 적은 쪽을 늘리 때는 안전하지 않으니 형변환 하기, 조상 -> 자손🔺
instanceof 연산자
- 참조변수의 형변환 가능 여부 확인, 가능하면 true
- 꼭 해줘야 한다
- if 문에 사용
매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다
여러 종류의 객체를 배열로 다루기
- 조상 타입의 배열에 자손타입의 객체를 담을 수 있다
- 다루고 싶은 객체들의 상속관계를 따져서 가장 가까운 공통조상 클래스타입의 참조변수 배열을 생성해서 객체들을 저장
추상클래스
- 추상메서드를 가진 클래스
- 다른 클래스 작성에 도움을 주기 위한 것으로 인스턴스 생성 불가
- 상속을 통해 완성해야 인스턴스 생성가능
추상화
- 템플릿을 뽑아내는 것(틀, 공통적인 것, 미완성)
- 잘 안바뀌는 부분, 공통적인 부분을 만들어 놓고 그걸 사용해서 나머지를 만든다
추상메서드
- 구현부가 없는 미완성 메서드
- 공통적으로 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용함(구현부가 자손마다 다를 경우)
- 추상메서드를 한개라도 구현하지 않으면 여전히 미완성(abstract 붙여야 함)
- 여러 클래스에 공통적으로 쓸 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통된 부분을 뽑아서 추상클래스 작성성
추상클래스 장점
인터페이스
- 추상메서드의 집합
- 구현된 것이 없는 설계도, 껍데기(모든 멤버가 public)
- 추상클래스보다 추상화 정도가 높다
- 메서드 핵심
- 두 대상 사이의 중간역할
- 인터페이스의 조상은 인터페이스만 가능
- 다중상속 가능(추상메서드는 구현부분이 없어 충돌X)
interface 인터페이스이름{
public static final 타입 상수이름 = 값;//상수O, iv,cv X
public abstract 메서드이름(매개변수 목록); //추상메서드(구현X)
}
public static final abstract 생략 가능
추상클래스와 인터페이스 차이
- 추상클래스: 추상메서드 + 일반 클래스
- 인터페이스: 추상메서드 빼고 구현된 것이 없음
- 둘 다 추상메서드를 가지지만 인터페이스는 iv 사용 불가
인터페이스 구현
class 클래스이름 implements 인터페이스이름{
(인터페이스에 정의된 추상메서드를 모두 구현해야 함)
}
- 일부만 구현할 경우, 클래스 앞에 abstract 붙임(상속을 통해 자손이 마저 구현한다)
인터페이스를 이용한 다형성
- 인터페이스도 구현클래스의 부모다
- 인터페이스 타입의 매개변수 : 해당 인터페이스를 구한 클래스의 객체를 제공
- 인터페이스 타입의 반환타입 : 해당 인터페이스를 구햔한 클래스의 객체를 반환
인터페이스의 장점
- 표준화 가능
- 관계 맺어주기 & 변경 가능: 직접 -> 간접
- 독립적인 개발 가능
- 두 대상의 연결, 대화를 하는 중간역할 = 기계와 소통이 쉽다
- 선언과 구현 분리
- A -> I B , A -> I C
- A와 B는 직접적 연결X, B를 C로 바꿔도 A는 영향 X
주간회고
- 객체지향이 모두 끝났다 중요한 만큼 어렵다
- 정리한 내용을 자주 보며 복습해야겠다
- 실습이 부족해서 실습를 더 늘려야겠다