-
[JAVA] 객체지향 1카테고리 없음 2019. 1. 26. 22:52
객체지향의 가장 큰 특징이자 장점은 재사용성이다.
자바로 짜여진 프로그램은 기본적으로 객체(Object(코드에서는 Class))단위로 구성되며 이 객체들은 서로 관계성있는 구조를 가진다.
객체지향의 특징은 다음과 같다.
추상화(Abstraction)
캡슐화(Encapsulation)
상속 (Inheritance)
다형성 (Polymorphism) ★★★
이러한 객체지향언어의 특징은 코드의 반복을 줄여줄 뿐만 아니라 가독성, 사용성, 유지보수 효율성,확장성이 좋아진다는 아주 큰 장점이 있다.
또한 객체 단위로 프로젝트 코드가 구성되기 때문에 분석,설계에도 용이하다.
자바로 어떤 프로젝트 프로그램을 설계하기 위해서는 상단의 4가지 개념은 반드시 숙지해야하며
디자인 패턴 개념을 기반으로 프로그래밍을 하면 작성된 코드의 유연성과 질이 높아진다.
1.Modifiers (접근제한자)
접근제한자란 클래스나 함수에 대한 접근 자격을 지정하는 키워드이다.
접근제한자는 다음과 같다.
private -이 제한자 선언이 소속된 Class에서만 호출 가능. 즉 소속된 클래스 안에서만 확인이 가능 (이하 소속된이라 표현한다)
default - 소속된 Class, 선언이 소속된 package에서만 호출 가능
protected - 소속된 Class, 선언이 소속된 package, package는 다르나 상속 받았다면 (Subclass가 되었으면) 호출 가능
public -소속된 Class, package, SubClass,Universe 전 범위적로 사용 가능
*Usage Modifier (사용제한자)
Static - 소속된 클래스를 굳이 생성하지 않아도 다른 클래스에서 사용할 수 있다. (Math 클래스 선언하지않아도 Math.round 사용가능하다. 즉 Round는 사용제한자 Static이 붙어있음을 간접적으로 알 수 있음)
final
- class앞에 붙이면 해당 클래스는 다른 클래스를 상속받을 수는 있지만 자신은 다른 클래스를 상속해 줄 수 없다.
- mathod앞에 붙이면 해당 메소드는 오버로딩은 가능하나 오버라이딩은 불가능하다.
- variable(변수)앞에 붙이면 해당 변수는 더이상 값을 변경할 수 없다. (상수가 되어버림)
abstract - 구현부가 미완성인 상태로 구현이 필요한 상태임을 의미한다.
2.Method (= Function = Operation = 함수 = 기능)
modifier returnType 함수명 (parameterType parameterName, parameterType parameterName, parameterType parameterName, .....){
}
returnType이 없을 때는 void
Ex)
public int setInformation (int point, double grade, String name){
return 0;
}
Overloading
같은 이름을 가진 메소드를 인풋 (Parameter), 아웃풋(returnType), 구현부를 재정의 하여
같은 이름을 가진 메서드를 여러개 만들 수 있는 행위를 말한다.
인풋인 Parameter는 반드시 달라야한다는 필수 조건이 있다.
Overriding
구현부를 구현하지않은 메소드들을 가지고있는 Interface를 상속받은 클래스 내에서 해당 미구현 메소드들을 구현하는 행위를 말한다.
3.상속 (Inheritance)
Class를 설계할 때 특정 Class의 Data(=변수(Variable))와 메소드를 사용하고 싶을 때 해당 특정 클래스를 사용하고자 하는 클래스에 extends 하는 것을 말한다. (여기서 특정 클래스는 부모클래스라 한다.)
서울이 대한민국 클래스를 상속 받는 것을 대한민국<-서울 로표현한다치자.
우주<-지구<-아시아<-대한민국<-서울
우주<-지구<-아시아<-대한민국<-대전
우주<-지구<-아시아<-대한민국<-부산
(객체지향의 상속!! 관점에서 우주>지구>아시아>대한민국>서울로 표현하기도 한다.
즉 우주는 지구보다 크다라고 할 때 지구는 우주를 상속받는다 라고 이해하면된다. 객체지향에서의 표현방식이다.)
이와 같은 상속 관계가 있을 때 서울의 상위클래스는 가장 가까운 윗단계인 대한민국 클래스이다.
(대한민국 클래스는 서울클래스보다 크다)
실제로도 자바(JVM)의 상속 관계에 대한 처리는 가까운 클래스부터 찾아 올라가며 작동한다.
보통은 상위 클래스를 '부모클래스' 라 하고 피상속 클래스는 '자식클래스' 라고 부른다.
즉, 아시아는 서울의 부모클래스의 부모클래스이며
지구는 서울의 부모클래스의 부모클래스의 부모클래스이다.
코드 선언시
우주 a = new 서울();
지구 a = new 서울();
와 같이
부모클래스 a = new 자식클래스
> 에 대한 선언은 가능하지만(부모>자식)
서울 s = new 우주
와 같이
자식클래스 s = new 부모클래스
< 에 대한 선언은 불가능하다.
부모클래스를 상속받은 자식클래스가 자체적으로 메소드를 2개 더 구현한 상황을 고려해보자.
부모클래스의 메소드 = 3개
자식클래스의 메소드 5개 (상속받은 부모클래스 메소드 3개 +자식클래스 자체 추가한 메소드 2개)
기본적으로 컴파일러(JVM)가코드 라인을 읽는 순서는 다음과 같다.
자식클래스 s = new 부모클래스();
↑ ↑ ↑ ↑
순서) 1 4 2 3
1. 자식클래스 s
자식클래스타입의 이름은 s인 래퍼런스 (주소) 를 스택메모리에 할당 받을 준비
2. new
Heap 메모리의 빈공간을 찾아라.
3. 부모클래스
VM이 접근하여 부모클래스를 방문해본 결과
자식클래스의 메소드 수를 알지못함 -> 컴파일 에러
반대로
부모클래스 p = new 자식클래스();
↑ ↑ ↑ ↑
순서 1 4 2 3
인 경우
1. 부모클래스 p
부모클래스타입의 이름은 p인 래퍼런스 (주소) 를 스택메모리에 할당 받을 준비
2. new
Heap 메모리의 빈공간을 찾아라.
3. 자식클래스
VM이 자식클래스를 접근해본 결과 상속받고 있는 상황이므로
가까운 부모클래스를 방문함
3개의 메소드가 있으니 불러오고
자식클래스의 메소드 수 2개 (자체 메소드)로 총 5개의 메소드 공간 확보.
4. =
해당 자식클래스가 존재하는 Heap 메모리의 주소를 스택 메모리의 p에 할당한다 .
-> 컴파일 문제없음
그렇다면 위에서 예시로 들었던
우주<-지구<-아시아<-대한민국<-서울
우주<-지구<-아시아<-대한민국<-대전
우주<-지구<-아시아<-대한민국<-부산
라는 상속관계를 통해 다음의 경우를 생각해 볼 수 있다.
같은 부모를 상속받은 피상속 클래스끼리는 타입 매칭이 되는가?
EX) 서울 s = new 대전();
답 : NO
이를 형제클래스끼리는 타입매칭이 안된다고 표현한다. 즉, 같은 부모를 상속받았더라도 서로 다른 존재(타입) 이다.
이유는 같은 부모를 상속받았더라도
JVM은 컴퓨터가하는 처리이기 때문에
대전이 몇개의 메소드를 가지고있는지
서울은 몇개의 메소드를 가지고있는지를 미리짐작하여 판단할 수 없기 떄문이다. (물론 실제로 컴파일러는 메소드 개수만이 판단기준은 아니며 더 복잡한 의사결정을 통해 에러 판단을 한다.)
상속관계에서 가장 중요한것은
상속관계를 먼저 파악한 뒤
대소관계로 정리만 하면된다. (지구>대전, 지구>서울, 서울!=대전)
대소관계로 정리하면 복잡하고 깊은 논리관계를 따지지 않아도 컴파일러의 판단을 아주 쉽게 파악 할 수 있다.
상속의 장점
- 재사용성 증가 (유지보수효율성 ↑)
- 일관성 증가
- 명세서
- 다형성
상속의 단점
- 지나친 상속은 프로그램 구조의 복잡성 증가
- 지나친 상속은 JVM의 관리에 부담을 준다.
- 지나친 상속은 성능 저하 발생 가능성이 있다.