객체지향의 특징 4가지
- 캡슐화
- 상속
- 다형성
- 추상화
1. 캡슐화
캡슐화가 무엇일까??
필자는 캡슐화를 생각하면 뽑기가 생각납니다. 뽑기에서 장난감이 캡슐안에 있는 것을 보았을텐데요!
이 캡슐을 목적은 필자가 생각하기에 물리충격에 의해 파손을 막고 변질될 우려가 있으므로 보호 차원에서 캡슐을 사용한 것 같습니다.
자 그러면 자바의 캡슐화의 개념을 살펴볼까요??
자바에서의 캡슐화는 클래스가 캡슐이고 내용물이 변수와 함수(메서드)이다.
즉, 외부에서 쉽게 접근하지 못하도록 하는 것과 은닉하는 것이 핵심이다!!
예제 코드
public class MemberVo {
// 멤버들이 전부 private
private String name;
private int age;
private String tel;
private String addr;
위의 코드를 보면 멤버들이 접근제어자 private로 지정된 것을 볼 수 있다.
private는 해당클래스만 접근이 가능하고 다른 외부 클래스, 패키지 등 접근이 제한 된다.
그러면 ? 위의 멤버들을 사용 할 때 직접적으로는 사용이 안된다는 것인데 어떻게 사용할까요??
직접 사용이 안되면 간접적으로 우리는 멤버들을 사용해야 한다.
간접적으로 사용할 때 getter / setter 메서드들을 사용하자.
예제 코드
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
여기서 필자는 의문점이 생겼습니다.
캡슐화는 멤버들이 변질되는 것을 막는 것인데 setter 메서들을 사용하면 캡슐화의 정책에 위반 된 것이 아닌가요???
생각을 해보면 setter 기능은 메서드이다.
메서드에 조건을 추가해주면 잘 못된 데이터들을 막을 수 있다.
이로서 데이터 변질을 막을 수 있다는 부분이다.
2. 상속
현실세계의 상속은 부모의 유산을 자식한테 물려준다!! 라는 생각이 나실 텐데요.
객체지향 프로그래밍에서도 똑같다고 생각합니다.
부모의 멤버들을 자식에게 상속한다(부모 멤버들을 자식이 사용 가능하게 하다).
즉, 클래스의 속성과 기능을 확장한다는 의미이다!!!.
예제 코드
부모 클래스
package javastudy.animal;
public class Animal {
public void eat(){
System.out.println("먹다.");
}
}
부모 클래스에 먹는 기능을 만들어 봤습니다.
자식 클래스
package javastudy.animal;
public class Dog extends Animal {
// 이름 나이 종 : 상태 정보
@Override
public void eat() {
System.out.println("개처럼 먹는다.");
}
public void fight(){}
}
Dog 라는 자식 클래스에 부모 클래스인 Animal 클래스를 상속하였습니다.
상속 방법은 클래스 옆에 extends를 붙이고 부모 클래스를 작성하면 상속이 됩니다.
위의 코드를 보시면 부모 클래스의 Animal에 있는 eat() 메서드들을 오버라이딩해 사용하고 있는 것을 볼 수 있습니다.
3. 다형성
다형성은 여러가지 가지고 있는 성격??? 이라고 할까요?? 필자가 생각하기엔 그렇습니다.
개념을 살펴 볼까요?
다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다는 것인데
위의 상속 편에서 예제 코드를 다시 사용하겠습니다.
예제코드
부모 클래스
public class Animal {
public void eat(){
자식 클래스
public class Dog extends Animal {
// 이름 나이 종 : 상태 정보
@Override
public void eat() {
System.out.println("개처럼 먹는다");
}
public void fight(){
System.out.println("개처럼 싸운다.");
}
테스트 클래스
위의 코드를 보면 한 객체의 여러 타입이 생성 되 있는 것을 볼 수 있습니다.
자식 인스턴스를 생성하면 자식의 멤버들만 사용이 가능합니다.
하지만 확장성이 넓은
부모 타입의 자식 인스턴스를 생성하면 부모 타입의 멤버를 재정의한 기능들을 자식타입에서 사욜 할 수 있다.
Dog라는 클래스 안에 기본 생성자가 있습니다. 이 기본 생성자 구현부에는 super() 라는 조상의 생성자를 호출하는 역할을 합니다.
그러므로 부모 클래스 타입의 자식 객체를 인스턴스 생성하면 먼저 부모 클래스가 호출이 되고 그다음 자식이 호출이 됩니다.
즉, 부모 먼저 생성 -> 자식 생성
'Laguage' 카테고리의 다른 글
[JAVA] JVM 구조 (0) | 2022.02.11 |
---|---|
[JAVA] 스레드 ( Thread ) (1) | 2022.02.08 |
[JAVA] Optional (0) | 2022.01.20 |
[JAVA] @애노테이션 ( Annotation ) (0) | 2021.12.28 |
[JAVA] 열거형 ( enums ) (0) | 2021.12.28 |
[java] 객체지향 프로그래밍 설계 원칙 - SOLID (0) | 2021.12.10 |
[java] 객체지향 프로그래밍 설계 원칙 - 결합도 / 응집도 (0) | 2021.12.09 |
Java DTO 관련 정리... (0) | 2021.11.21 |