객체 지향 프로그래밍 - OOP (2)

이상혁·2023년 12월 19일
0

지난 게시글에서 객체지향프로그램이 무엇인지 알아보았다.
이제 객체 자향 프로그래밍의 특징에 대해서 알아보자

객체 지향 프로그래밍의 특징은 4가지가 있다.
추상화, 상속, 다형성, 갭슐화이다.

추상화

추상화의 핵심은 공통성과 본질을 모아 추출하는 것이다.
즉, 객체의 공통적인 속성과 가능을 추출하는 것이다.

예시로 자동차와 오토바이를 들면
자동차와 오토바이는 다르지만 시동을 걸고 전진을 할 수 있다는 공통점이 있다.
이 공통점을 추출하여 이동수단이라는 상위의 클래스로 정의를 하는 것이다.

이렇게 공통적인 기능과 속성을 메소드와 변수로 추출을 해서 선언하는 것이 추상화이다.
자바에서는 추상화를 구현하기 위해서 추상 클래스와 인테페이스를 사용을 한다.

상속

상속은 위에서 알아본 추상화의 연장선이다.
기존의 클래스를 재활용해서 새로운 클래스에 작성을 하는 것이다.

풀어서 설명을 하면
클래스들 간에 공통된 특성과 기능을 상위 클래스로 추상화를 시키고 상위 클래스에 추상화가 된 속성과 기능을 하위 클래스에서 사용이 가능하도록 하는 것이 상속이다.

public class Vehicle {
	
    String on;
    
    void moveFoward() {
    	System.out.printIn("앞으로!!");
    }

}


public class car extends Vehicle {
	
}

위에 코드처럼 상위 객체를 만들고 상속을 해주면 car 인스턴스에서 moveForward를 사용하지 정의 하지 않아도 사용을 할 수 있다.

또 상위 클래스에서 상속을 받는 메소드를 오버라이딩을 통해서 내용을 재정의 할 수도 있다.

다형성

다형성은 객체지향 프로그래밍의 꽃이라고 불린다.
다형성의 뜻을 보면 상황에 따라서 여러 가지의 형태를 가질 수 있는 성질을 말한다.

객체 지향에서 다형성을 이야기 하면 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성을 이야기한다.

인터페이스를 이용하면 다형성을 활용할 수 있다.

public interface Vehicle {
	
    String on;
    
    void moveFoward() {
    
    }

}


public class Car implements Vehicle {
	@Override
    moveFoward() {
    	System.out.printIn("자동차가 앞으로!!");	
    }
}

위 코드처럼 interface에서는 메소드를 선언만 해두고 구현을 하지 않는다.
그리고 구현은 구현체의 @Override를 통해서 구현을 한다.

이렇게 필요한 기능을 선언만 해두고 각각의 클래스에서 원하는 대로 구현을 하는 것이다.
같은 메소드라도 역할에 따라 각자의 객체가 다른 기능을 수행하는 것이다.
그러면 다양한 형태의 객체를 만들 수 있다.

한 가지 더 중요한 것은 다형성은 상위 클래스의 타입으로 하위 클래스의 타입을 조회할 수 있다.
이 부분이 중요하다.

이게 무슨 말이냐면 우리가 정의한 interfacre의 타입으로 하위 클래스인 car를 사용할 수 있다.

Vehicle car = new Car();

위에 코드처럼 Car의 인스턴스를 만드는데 Vehicle의 타입을 사용한 것이다.
만약 Vehicle 인터페이스로 bike도 구현을 했다고 해보자

public class Bike implements Vehicle {
	@Override
    moveFoward() {
    	System.out.printIn("오토바이가 앞으로!!");	
    }
Vehicle bike = new Bike();

그러면 Bike도 Vehicle의 타입으로 사용이 가능하다.
이 상황은 언제 많이 쓰일까?

한 번 코드를 보자

public class test{
	void forword (Vehicle car) {
    	car.moveFoward
    }
    
    void forword (Bike bike) {
    	bike.moveFoward
    }
}

만약 다형성을 사용하지 않는다면
car는 Car 타입대로, bike는 Bike 타입대로 메소드를 따로 만들어야 한다.

하지만 다형성을 사용한다면 Vehicle 타입 하나로 한 개의 메소드만을 사용할 수 있다.

public class test{
	void forword (Vehicle vehicle) {
    	vehicle.moveFoward
    }
}

위에서 살펴보았듯이 Vehicle 타입으로 Car와 Bike를 다 받기 때문에 코드가 간결해지고 건들리지 않아도 된다.

이렇게 인터페이스를 이용하면 다형성을 잘 활용할 수 있다.

캡슐화

캡슐화는 서로 관련잉 있는 속성과 기능을 하나의 캡슐로 만들어서 데이터를 외부로 부터 보호하는 것이다.
캠슐화를 하는 이유는 외부로부터 클래스에 정의된 속성과 기능을 보호하고
내부의 동작을 감추고 외부에는 필요항 부분만 노출하기 위함이다.

이를 데이터 보호, 데이터 은닉이 라고 한다.

데이터 보호와 데이터 은닉을 통해서 각 객체의 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적이다.

갭슐화를 하는 방법에는 접근제어자를 사용하거나 getter/setter를 사용하는 방법이 있다.

먼저, 접근 제어자를 살펴보면 클래스 내부에 멈베들을 외부에서 접근을 제한하는 역할을 한다.
private, default, protected, public이 있는데 이들이 제어접근자이다.

제어 접근자는 위의 표의 범위를 가진다.

두 번째 방법은 getter/setter를 사용하는 방법이다.

public class Car {
	private model;
    
    public getModel () {
    	return model;
    }
    
    public setModel (String model) {
    	this.model = model;
    }
    
}

위에 코드처럼 속성을 private로 놓고 get함수와 set함수를 통해서 값을 변경을 해줄 수 있다.

profile
개발 공부 하기 위해 만든 블로그

0개의 댓글