본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JAVA/객체지향

JAVA - 객체지향 프로그래밍(OOP) 특징 - 1

by 방구석 대학생 2022. 1. 23.

 

객체 지향 프로그래밍(OOP) 의 특징

 

1. 추상화

추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념이다.

 

두 가지 사례를 통해 예시를 들어보자.

1. 지도의 경우 위성지도와 등고선지도 등 여러가지가 있는데, 각 지도마다 목적이 다르다.

* 위성 지도 : 그 지형의 정확한 실제 모습을 담기 위한 목적의 지도

* 등고선 지도 : 지형의 높낮이를 표현하기 위한 목적의 지도

 

등고선 지도를 그릴 때, 목적에 맞지 않는 부분을 제외하고 필요한 부분(지형의 높낮이) 만 표현한다.

 

2. 강아지, 고양이, 뱀 등 서로 다른 특징을 가지고 있는 동물들을 표현해야 한다고 해보자.

이룰 추상화 하려면 공통되는 특징들은 표현하고, 그렇지 않은 특징들은 제외시킴으로서 추상화가 가능하다.

- 강아지, 고양이, 뱀 등 서로 다른 클래스들은 필요하다면 나중에 만들어주되, 우선 공통되는 특징들만을 가지고 추상화하여 하나의 클래스로 묶는다.

- 이 경우 이름, 나이, 체중 등과 같은 공통적인 특징들을 가지고 Animal 이라는 하나의 클래스로 추상화하여 강아지, 고양이, 뱀과 같은 서로 다른 클래스들을 묶어줄 수 있다.

 

 

2. 캡슐화

외부에 노출 시킬 필요가 없는 객체의 정보들을 은닉시키는 것을 말한다.(정보 은닉)

 

캡슐화는 서로 관련이 있는 변수와 함수를 하나의 클래스로 묶고, 외부에서 쉽게 접근하지 못하도록 은닉하는게 핵심이다.

객체에 직접적인 접근을 막음으로서 외부에서 내부의 정보에 직접 접근하거나 변경할 수 없고, 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능하다.

 

* 캡슐화의 가장 큰 장점은 정보 은닉(Information Hiding)이다.

외부에서 객체에 접근하는데 있어 정보를 숨기고 객체의 연산을 통해서만 접근이 가능하게 하는것이다.

- 정보 은닉의 장점은 외부에서 특정 객체의 데이터 및 함수의 직접 접근을 막음으로서 함부로 변경하지 못하게 함 으로서 유지보수나 확장시 오류의 범위를 최소화 할 수 있고,

객체 내부 정보 손상 및 오용을 방지하고, 조작법이 바뀌어도 사용방법 자체는 바뀌지 않고, 데이터가 변경되어도 다른 객체에 영향을 주지 않기 때문에 독립성이 좋다.

또한 처리된 결과 사용으로 이식성이 좋으며, 객체를 모듈화 할 수 있어 새로운 시스템의 구성에 하나의 모듈 처럼 사용이 가능하다.

* 보통은 데이터들은 공개되지 않고 몇 개의 메소드 만이 외부로 공개된다.

 

* 캡슐화의 핵심 - 접근 제어자

캡슐화를 하기 위해서는 접근제어자를 통해 설계가 잘 이루어져야 한다.

자신 내부의 모듈은 감추고, 다른 모듈 내부 작업도 직접적으로 개입하지 못하도록 설계해야 한다.

 

* 클래스 접근 제어자

- default : 동일 패키지의 클래스(class) 에만 인스턴스(객체) 생성을 허용한다.

- public : 다른 패키지에서도 인스턴스(객체) 생성을 허용한다.

 

* 메소드 및 변수 접근제어자

- private : 동일한 클래스 안에서만 접근이 가능하다. this 를 사용하는 필드는 외부에서 접근 불가능하고 상속도 되지 않는다.

-> private 키워드를 통해 접근이 제한된 필드의 경우 public 으로 정의된 getter, setter 와 같은 메소드들을 통해 접근해야 한다.

- default : 접근 제어자가 없는 형태로, 동일한 패키지 내부에서는 접근이 가능하다.

- protected : 동일한 패키지 안에서 사용가능하고, 다른 패키지라고 해도 상속 받은 클래스에는 접근이 가능하다.

- public : 모든 객체에서 접근 가능하다.

 

 

3. 상속

상속 관계에 있는 두 클래스에 대해, 부모 클래스가 자식 클래스에게 속성을 물려주는 것을 말한다.

주로 코드의 재사용이 목적이다.

 

상속을 사용하면 기존 클래스의 필드와 메소드를 물려받음 으로서 코드의 중복을 줄일 수 있고, 더 나아가 프로그램을 보다 손쉽게 확장해 나갈 수 있다.

- 중복되는 특징을 가지고 있는 클래스 간의 상속을 통해 똑같은 코드가 중복되는 경우를 방지할 수 있다.

- 코드의 중복을 방지함과 동시에 부모 클래스를 상속 받는 클래스의 경우, 그 클래스만의 구별된 필드와 메소드를 사용함으로서 손쉽게 프로그램을 확장할 수 있게 된다.

- 이때, 토대가 되는 클래스를 부모 클래스, 상속 받는 클래스를 자식 클래스라고 한다.

 

* 상속을 통해 활용할 수 있는 기능 : 업 캐스팅

- 업 캐스팅이란 자식 객체를 부모 객체의 타입으로 해석하는 것을 말한다.

예를 들어 아래와 같은 상속 관계를 가지는 클래스가 있다고 가정해보자.

Cat.java

class Cat extends Animal {
	// Cat 클래스가 Animal 클래스를 상속받는다.
}

위와 같은 상황에서는 다음과 같이 업 캐스팅이 가능해진다.

Cat c = new Cat();
Animal a = c; // Cat 객체를 Animal 객체로 해석

이러한 업 캐스팅은 다양한 객체들을 부모의 타입으로 관리할 수 있게 한다.

 

하지만 위 내용의 반대는 성립하지 않는다는 것을 주의하자.

아래와 같은 경우는 불가능하다.

Animal aaa = new Animal();
Cat ccc = aaa; // 성립 불가능

 

* 상속을 통해 활용할 수 있는 또 하나의 기능 : 메소드 오버라이딩(Overriding)

- 메소드 오버라이딩이란 부모의 메소드를 자식 클래스에서 다른 내용으로 재정의 하는 것을 말한다.

가령 부모 클래스 Wizard 의 파이어볼 메소드는 데미지를 10을 준다고 할 때, 이를 물려받은 자식 클래스 GreatWizard 에서는 30 데미지를 주고 싶다면 부모 클래스에 있는 데미지를 주는 메소드를 자식 클래스에서 데미지 수치를 변경하여 재정의 할 수 있다.

 

* 상속관계에서 사용될 수 있는 키워드 : protected, super

- protected 는 상속 관계의 클래스 까지만 접근을 허용한다.

아래와 같은 경우 protected 키워드로 정의된 필드에 접근 가능하다.

class A {
	protected String name;
}

class B extends A {
	public void printName(){
		// 부모 클래스 A의 필드 name 을 출력(protected)
        System.out.println(name);
    }
}

 

- super 키워드 : 자식 객체를 생성과 동시에 초기화 하려면 먼저, 부모의 생성자가 호출되어야 한다. 이를 위한 키워드가 바로 super 키워드이다.

class Novice {
    protected String name;
    protected int hp;
    
    public Novice(String name, int hp){
    	this.name = name;
        this.hp = hp;
    }
}

class Wizard extends Novice {
	protected int mp;
    
    public Wizard(String name, int hp, int mp){
    	super(name, hp); // 부모 클래스 생성자 호출
        this.mp = mp;
    }
}

// super 메소드로 인해 부모 클래스의 생성자를 먼저 생성해 줌으로서
// 자식 클래스 객체는 생성과 동시에 초기화 시키는게 가능해진다.
Wizard w = new Wizard("프로도", 100, 80);

 

 

참고 : https://victorydntmd.tistory.com/117

 

객체 지향 프로그래밍( OOP ) 개념

1. 객체 지향 프로그래밍 ( Object Oriented Programing ) 1) 객체 객체란 말 그대로 대상을 나타내는 단어입니다. 예를 들어, 사람 개인 한 명 한 명을 모두 객체라 할 수 있고, 책 한 권 한 권을 객체라

victorydntmd.tistory.com