객체지향 요약 PART2
by ash
<참고>
자바의정석 7장
1.상속
-상속의 정의와 장점
상속관계
- 기존클래스 재사용하여 새로운 클래스 작성
- 자손은 조상의 모든 멤버 상속 받음(생성자, 초기화 블럭 제외)
- 자손 멤버개수 >= 조상 멤버개수
- class 자손클래스명 extends 부모클래스 클래스 간의 관계
포함관계
- 한 클래스 멤버변수로 다른 클래스 선언
- 작은 단위 클래스부터 만들고, 멤버변수화(객체화) Ex)class Circle의 int x, y, z 중 x, y를 한 point클래스로 만들어서 Circle에서 객체생성
상속 vs 포함 : ‘is a’ vs ‘has a’ 대입해보기
단일 상속
- 다중 상속 불가(하나만 상속 가능, 나머지 포함 처리)
Object 클래스 – 모든 클래스의 조상
- 상속 받지 않는 모든 클래스는 컴파일시 자동 Object 클래스 상속
- toString( ), equals( ) 등의 메서드 11개 정의 되어 있음
2.오버라이딩
-오버라이딩이란?
- 조상 메서드를 자손에 맞게 변경하는 것(구현부, 위치만 다름)
-오버라이딩 조건
- 선언부 일치
- 부모보다 예외선언 적어야 함
- 부모보다 접근제어자가 같거나 넓어야 함
-오버로딩 vs 오버라이딩 (1)오버로딩 ->new / 오버라이딩 -> change
-super,super()
- super : 조상멤버와 자신 멤버 구별하기 위해 사용
System.out.println(super.x);
- super( ) : 조상 멤버들도 초기화를 해야하기 때문에, 자손의 생성자 첫 문장에 조상생성자를 super( )로 호출
3.package & import
-package
- 클래스묶음(폴더와 파일 관계)
- 1 소스 파일, 1 패키지 원칙(점으로 계층 구분)
- 하나의 디렉토리
- package 패키지명;
- 첫줄에 한 번만 선언 가능. 선언 안 할 시에는 자동으로 ‘unnamed package’ 소속
-import
- 다른 패키지에 있는 클래스를 사용하기 위해 import문 사용
- 사용시, 클래스 이름에서 패키지명 생략 가능
- 단축키 ctrl + shift + o
- 사용해도 프로그램 성능 영향 X
- 선언방법 : import 패키지명.클래스명; 또는 import 패키지명.*:
- 미사용시 패키지 주소 다 써줘야 함 cf)클래스패스 : 클래스 파일을 찾기 위한 경로
4.제어자(modifier) 제어자란?
-제어자 종류
- 접근제어자 : public-protected-(default)-private
- 그 외 : static(멤버변수,메서드만), final, abstract
-final
- 클래스에 적용 : 조상될 수 없는 클래스
- 메서드에 적용 : 오버라이딩 불가 메서드가 됨
- 변수(멤버+지역)에 적용 : 변경불가 상수가 됨
-접근제어자
접근제어자를 이용하여 캡슐화를 할 수 있음
접근제어자 | 같은클래스 | 같은패키지 | 자손클래스 | 전체 |
---|---|---|---|---|
public | ㅇ | ㅇ | ㅇ | ㅇ |
protected | ㅇ | ㅇ | ㅇ | |
(default) | ㅇ | ㅇ | ||
private | ㅇ |
- 생성자에 private 제어자 붙이기 ->생성자 외부에서 사용 불가로 인스턴스 생성 불가
- 외부에서 생성자에 접근 못하기 때문에 인스턴스 생성불가 ->클래스 내부에서 생성하여 외부에서 참고해야 함
5.다형성
-다형성이란?
- 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것
== Handphone을 부모클래스, Smartphone을 자식클래스로 가정 ==
Handphone hp = new Smartphone( ); //가능
반대는 불가능!
Smartphone sp = new Handphone( ); //불가능
-참조변수의 형변환
- 상속관계끼리 변환 가능(자손<->조상)
- 참조변수의 형변환은 인스턴스 영향 없음(리모콘만 바뀜)
-instanceof 연산자
- 해당타입으로 형변환 가능 여부를 확인
if(c instanceof audi){ audi fe = (audi)c; } //결과가 true. 형변환 가능
-참조변수와 인스턴스의 연결
- 메서드가 중복정의된 경우, 참조변수 타입 관계 없이 항상 실제 인스턴스 타입에 정의된 메서드 호출
-매개변수의 다형성(다형성의 장점)
- 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다
void buy(Product p);
- 조상타입의 배열에 자손들의 객체를 담을 수 있다
Car[ ] car =new Car[2]; car[0] = new Audi( ); car[1] = new Hyundai( );
6.추상클래스(abstract class)
-추상클래스란?
(1)미완성설계도 (2)추상메서드(미완성메서드)를 포함하는 클래스 (3)일반메서드가 추상메서드 호출 가능 (4)완성된 설계도 아니기 때문에 인스턴스 생성불가 (5)다른 클래스 작성 도움 목적
-추상메서드란?
- 선언부O / 구현부X
- 자손마다 다르게 구현될 것으로 예상되는 경우 사용
- 자손이 구현해야 함
- 추상메서드가 2개인데 1개만 구현하면 앞에 abstract 붙여야함
-추상클래스 작성법 2가지
- 여러 클래스에 공통적으로 사용될 수 있는 추상클래스 바로 작성
- 기존 클래스의 공통부분 뽑아서 추상클래스 작성
7.인터페이스
-인터페이스란? (1)추상클래스보다 추상화정도 높음 (2)추상메서드의 집합(일반메서드 없음) (3)인스턴스 생성 불가, 클래스 작성에 도움 목적 (4)정해진 규칙에 맞도록 표준 제시
*인터페이스와 추상클래스의 차이 ->iv의 유무
-인터페이스 작성
- class대신 interface 사용
interface Car{
[public static final] 타입 상수이름 = 값;
public [abstract] 메서드이름(매개변수);
}
- 구성요소는 추상메서드, 상수만 가능
- 모든 멤버변수는 public static final(생략가능)
- 모든 메서드는 public abstract(생략가능)
- 모든 멤버변수가 static이 있으므로, iv가 있을 수 없다.이것이 추상클래스와의 큰 차이(iv의 유무)
-인터페이스 상속
- 인터페이스도 상속가능(다중상속 O)
- Object같은 최고조상 없음
-인터페이스 구현
class 클래스명 implements 인터페이스명{
//인터페이스에 정의된 추상메서드 구현
}
- 상속,구현 동시 가능
class Fighter extends Unit implements Fightable{
}
-인터페이스를 이용한 다형성
- 인터페이스 타입 변수로 이를 구현한 클래스 인스턴스 참조 가능
Fightable f = new Fighter( );
- 인터페이스를 메서드의 매개변수 타입으로 지정가능
void attack(Fightable f){ } //인터페이스를 구현한 클래스의 인스턴스를 매개변수로 받는 메서드
- 인터페이스를 메서드의 리턴타입으로 지정가능
Fightable method(){
return new Fighter( );
}//인터페이스 구현한 클래스의 인스턴스를 반환
-인터페이스를 이용한 장점
- 개발시간 단축 가능
- 표준화 가능(일관성UP) Ex) JDBC
- 관계없는 클래스들까지 관계 맺기 가능
- 독립적 프로그래밍 가능(A-B -> A-I-B)
-인터페이스 기타
- 두 대상(객체) 간의 연결을 돕는 ‘중간역할’ Ex)돼지코, GUI
- 클래스 사용하는 쪽(USER), 클래스 제공하는 쪽(PROVIDER) 존재. 메서드 호출하는 쪽(USER)은 사용하려는 메서드의 선언부만 알면 됨.
8.내부클래스
-내부클래스란?
- AWT나 Swing 같은 GUI 어플리케이션 이벤트처리에 자주 사용
- 클래스 내에 선언된 클래스(서로 긴밀한 관계에 있는 경우 가능)
- 내부 클래스에서 외부 클래스 멤버들을 쉽게 접근 가능. 코드 복잡성을 줄일 수 있음(캡슐화)
class C{
class D{
}
}
-내부클래스 종류와 특징
-
내부 클래스 종류 = 변수
-
선언위치에 따른 종류
- instance class : 외부클래스의 인스턴스 멤버처럼 다루어짐. 외부클래스의 인스턴스 멤버들과 관련된 작업에 사용
- static class : 외부클래스 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어짐. 외부클래스의 static멤버, 특히 static메서드에서 사용될 목적
- local class : 외부 클래스의 메서드나 초기화 블럭 안에 선언. 선언된 영역 내부에서만 사용
-내부 클래스의 선언
- 클래스 선언 위치 = 변수 선언 위치
//변수 선언 자리를 보여주는 예시
class Outer1{
int iv = 0;
static int cv = 0;
void myMethod(){
int lv = 0;
}
}
//내부클래스 선언 자리를 보여주는 예시
class Outer2{
class InstanceInner{}
static class StaticInner{}
void myMethod(){
class LocalInner{}
}
}
-내부 클래스의 제어자와 접근성
- 내부 클래스는 absract, final, private, protected 모두 가능
- 내부 클래스 중에서 스태틱 클래스(Static Inner)만 static멤버를 가질 수 있음
Subscribe via RSS