Another Brain

6일차_ 객체지향 특징(Object Oriented Programming; OOP) 본문

P/JAVA

6일차_ 객체지향 특징(Object Oriented Programming; OOP)

뉸누나ㄴ나 2021. 5. 26. 19:46

-- 객체지향 특징(OOP:Object Oriented Programming)
-- Encapsulation (은닉성)
-- Inheritance (상속)
-- Polymorphism (다형성)
>> overloading(중복정의)
>> 큰타입의 기억공간 (자동 형변환 : 작은타입의 데이터는 큰타입의기억공간 자동할당)
>. overriding(재정의)

-- super
-- instanceof

-- Access Modifier **
-- this **
-- type casting
>> 자동 형변환 : 작은타입의 데이터는 큰타입의기억공간 자동할당
>> 명시적 형변환 : 타입 변수명 = (타입)값;
-- overloading(중복정의)


## ----------------------------------
## Modifier (제한자, 제어자)
## ----------------------------------
1. Access Modifier (접근 제한자)
1) + public : universe (누구나 접근가능)
2) # protected : sub class(상속 받으면 접근 가능)
3)   생략 : same package (다른 패키지 접근불가)
4) - private : same class (다른 클래스 접근불가)

-- 클래스 : public, 생략(default)
-- 멤버변수, 메서드, 생성자 : public, protected, 생략, private
-- 지역변수 : 생략

2. Usage Modifier (사용 제한자)
1) static
2) final
3) abstract
4) transient
5) synchronized
6) ...


## ----------------------------------
## Encapsulation (은닉성)
## ----------------------------------

1. 목적 : 정보 및 알고리즘 보호 (Information hiding)

2. 장점 : 안정성, 편리성, 유지보수성

3. 형식 :
(1) private 멤버변수 선언  : private xxx;
(2) public setter() / getter() 메서드 선언

 -- setter() 메서드 형식 :
public void setXxx(xxx타입 xxx) {
// xxx 검증규칙에 올바른지 비교
// 올바르면 값을 변경
// 올바르지않으면 오류처리
}

 -- getter() 메서드 형식 :
public xxx타입 getXxx() { 
return xxx;
}
 
(3) private 데이터변경전에 올바른 데이터인지 검증 메서드 선언
-- setter() 메서드 내부에서 호출사용
-- 검증규칙 메서드 형식 :
private boolean isXxx(xxx타입 xxx) {
if(검증조건) {
return true;
} else {
return false;
}
}



## ----------------------------------
## Inheritance (상속):
## ----------------------------------

1. 목적: 
- 재사용성, 확장성, 유지보수성 향상
- 같은 종류의 객체들의 속성, 기능을 일반화 시켜 설계 (가전제품 <- 테레비, 라디오, 선풍기 등)
- 단일상속만 지원 (다중상속 개념으로 다중 인터페이스 구현 제공)
- 계층적 상속 구조 : Object <- Super <- Sub

2. 방법: 

- 일반화시켜 모델링 되어 있는 부모클래스를 서브클래스에서 상속 정의
- 자식클래스(sub) 선언 방법 :
public 서브클래스명 extends 부모클래스명 { }

- 부모클래스의 모든 멤버 상속
- 부모의 private 멤버도 상속은 되나 접근권한 제한으로 자식이 사용못함
- 부모의 생성자는 부모 객체를 생성시에 사용하는것이므로
- 서브클래스의 생성자에서 부모클래스의 생성자를 명시적으로 지정은 가능함
- 서브클래스에서 부모의 생성자 미지정시에는 자동으로 부모의 기본생성자로 생성됨 
- sub " is a " super 관계가 성립되어야만 올바른 부모클래스를 상속한것임
- 잘못하면 "Dog is a Person" 도 될수 있음


## ----------------------------------
## Polymorphism (다형성):
## ----------------------------------

1. 목적 : 
- 메서드 및 변수에 다형성을 적용하여 유지보수성, 확장성, 재사용성의 효율을 높임
- 적용 : 멤버변수타입, 매개변수타입, 반환타입, 배열타입, 메서드 
- 즉, 부모타입의 변수로 선언하면 모든 자식객체를 담을수 있는 저장공간

2. 다형성 종류
2.1  Overloading (중복정의)
- 같은 클래스, 또는 상속받은 메서드를 아규먼트 인자를 다르게 받도록 여러개 중복 정의
- 메서드 이름은 동일하고,
- 메서드의 아규먼트의 갯수, 순서, 타입은 반드시 다르게 지정해야함
- 메서드의 반환타입, 접근제어자는 상관없음 (즉, 같아도 되고, 달라도 됨)

2.2 Overriding (재정의)
- 상속받은 메서드를 서브클래스에 맞도록 코드구현로직을 변경하여 사용함
- 반환타입, 메서드이름, 메서드 아규먼트 갯수, 순서, 타입은 동일해야함
- 접근권한은 부모클래스의 권한보다 축소될 수 없음(즉, 같거나 확장은 가능함)
- 예외는 부모클래스의 예외보다 확장될 수 없음(즉, 없거나, 작거나, 같은 예외를 던져야함)

2.3 부모타입으로 변수 선언 
- 배열타입, 메서드의 매개변수 타입, 메서드의 반환타입, 단일변수타입
- 부모타입의 참조변수로 서브객체를 reference 할 수 있음
- 부모타입의 참조변수로는 서브객체의 멤버는 접근할 수 없음
- 서브객체의 멤버를 접근하기 위해서는 서브객체타입으로 캐스팅하여 사용가능함
- 예:
Person p = new Employee("홍길동", "인사팀", "서울시");
p.name = "정유진";  // 부모의 멤버이므로 접근 가능
p.dept = "감사팀"; // 자식멤버는 부모의 타입으로 접근 불가능하므로 컴파일오류
Employee e = (Employee)p;
e.dept = "감사팀";  // 자식타입으로 캐스팅후 자식객체의 멤버 접근 가능

2.4 instanceof 키워드
- 자식타입으로 캐스팅하는경우에 캐스팅하기전에 해당 객체의 인스턴스인지 검사
- 예:  
if (p instanceof Employee) { 
Employee e = (Employee)p;
} else {
// 다른객체의 인스턴스이므로 캐스팅 오류 발생처리
}

## ----------------------------------
## this 키워드
## ----------------------------------
-- 객체생성시에 자동으로 제공하는 참조변수
-- 사용방법 :
1. 현재 객체를 지칭 : this
2. 멤버변수 지칭 : this.멤버변수명
>> 멤버변수명과 지역변수명을 동일하게 사용가능
>> 멤버변수를 this 식별가능하기때문에(편리)

3. 현재 객체의 다른생성자를 호출시에 사용
>> 첫번째 수행문 위치
>> this(params)
>> 생성자 중복정의시에 효율적 : 중복 코드 제거, 로직의 일관성 유지, 유지보수 편리
>> 객체생성시에 공통 로직 : 생성자 위임설계해서 this() 호출 사용


## ----------------------------------
## super 키워드
## ----------------------------------
- 부모 객체를 가르키는 참조변수

- 방법:
1) 부모의 멤버변수 및 멤버메서드를 가르킬때 사용
super.부모멤버변수명;
super.부모멤버메서드명();

2) 자식객체의 생성자에서 부모객체의 생성자 지정시 사용
super(param데이터1, param데이터n);

부모생성자를 지정하지 않으면 자동으로 super() 부여됨
즉, 부모의 아규먼트를 받지 않는 생성자에 의해서 부모객체 생성함

주의사항: 
자식객체의 생성자의 첫번째 수행문으로 선언
this() 와 super() 함께 사용 못함

## ----------------------------------
## instanceof 키워드
## ----------------------------------
1. 해당객체가 클래스의 인스턴스인지 확인해서 
   인스턴스이면 true 반환 그렇지 않으면 false를 반환
   객체타입으로 형변환 하기전에 확인한후 형변환 권장

2. 사용법:
if (부모참조변수명 instancof 서브클래스이름) {
서브클래스이름 자식참조변수명 = (서브클래스이름)부모참조변수명;

// 캐스팅을 수행한 후에는 자식의 모든 멤버를 접근 가능함
자식참조변수명.자식멤버변수명;
자식참조변수명.자식멤버메서드명();


3. 주의
-- 다중 if ~ eles if ~ 로 instanceof 확인시에는 
   sub-class가 앞에 나오고 뒤에 super-class가 위치되어야함

--  if(참조변수명 instanceof Customer) {  // 맨앞에서 다 처리하므로 뒤에 서브로 내려가지않음

} else if (참조변수명 instanceof GeneralCustomer) {

} else if (참조변수명 instanceof SpecialCustomer) {

}

Comments