[Java] 객체지향프로그래밍(OOP) 의 개념과 특징

KIM Jongwan·2024년 6월 7일
0

JAVA

목록 보기
4/4
post-thumbnail
post-custom-banner

객체지향프로그래밍과 절차지향프로그래밍의 차이를 알고 그 특징에 대해 이해할수있다.

Java 언어완벽한 객체지향 언어라고 할 수 있습니다. 흔히 이야기하는 객체지향 프로그래밍의 주요 특징인 추상화, 상속, 다형성, 캡슐화를 완벽하게 지원하기 때문입니다. 객체지향 프로그래밍의 개념과 특징에 대해 조금 더 자세하게 알아보겠습니다.

절차지향프로그래밍과 객체지향프로그래밍

흔히 객체지향 프로그래밍의 개념을 설명할 때 절차지향 프로그래밍과 비교하여 설명을 합니다. 하지만 따지고 보면 객체지향 프로그래밍과 절차지향 프로그래밍은 프로그래밍 패러다임의 일부일 뿐 서로 대척점에 놓여있는 개념은 아닙니다.

절차 지향 프로그래밍

절차지향 프로그래밍은 작성된 코드를 순차적으로 처리하며 프로그램을 실행합니다. 때문에 서로 다른 프로시저간 강한 결합 관계를 보여줍니다. 특정 부분을 수정하기 위해서는 수정 부분 전후로 실행되는 프로시저의 영향도 파악이 중요하기 때문에 유지보수에서는 유리하다고 볼 수 없습니다.
하지만 프로시저간 긴밀한 상호 작용이 필요한 상황이나 성능이 중요한 경우 절차지향 프로그래밍 방식이 적합한 경우도 있습니다.

객체 지향 프로그래밍

객체지향 프로그래밍서로 다른 객체간 상호 작용을 통해 프로그램을 실행합니다. 하나의 객체는 필요한 역할만을 수행하기 때문에 서로 다른 객체간의 결합도를 낮출 수 있고 필요한 기능을 하나의 객체에 모아 응집도를 높일 수 있습니다. 또한 수정이 필요한 경우 해당 객체만 수정을 하면 되기 때문에 유지보수에 있어 이점이 있습니다.
이러한 특성들로 규모가 크거나 다수의 개발자가 투입되는 프로젝트의 경우 객체지향 프로그래밍 방식이 적합하다 할 수 있습니다.

객체지향 프로그래밍에 대해 조금 더 자세하게 알아보도록 하겠습니다.


객체와 Class

객체

'객체(Object)'실세계에 존재하거나 생각할 수 있는 사물 혹은 개념과 같은 것들을 말합니다. 모든 행동들은 이 '객체'간 상호 작용으로 표현될 수 있어야합니다. 예를 들어 의자, 책상과 같은 사물들과 패러다임, 민주주의와 같은 개념 또한 객체라고 말할 수 있겠습니다.

Class

객체는 프로그램에서 사용 될 수 있도록 추상화하여 Class형태로 구현됩니다.
실세계의 사물인 의자를 추상화하여 Chair.class를 작성해봅시다.

//실세계의 사물 '의자'를 추상화한 Chair.class
public class Chair entend Furniture{

	//Constructor
    public Chair(){}
    ...

	//Field
	private int lag;
    ...
    
    //Method
    public void sit(){
    	...
    }

}

Class는 생성자(Constructor), 필드(Field), 메소드(Method)로 이루어져있습니다.

생성자(Constructor)란 정의된 Class를 인스턴스화 하기 위해 호출되는 메소드입니다. 인스턴스는 다음 단락에서 알아보도록 하겠습니다.
필드(Field)란 실세계의 데이터 영역입니다. 의자 클래스를 정의 할 때 의자의 성분, 다리의 수, 가격, 형태 등이 필드 영역에 속하는 항목들입니다.
메소드(Method)는 클래스를 사용하여 실행할 수 있는 행위들입니다. 의자 클래스의 경우 '앉다.', '분해하다.' 와 같은 메소드들이 존재할 수 있겠습니다.

객체지향 프로그래밍의 핵심은 이러한 Class를 정의하고, 인스턴스를 생성하여 이들의 상호 작용을 통해 프로그램을 실행한다는 것입니다.


객체지향 프로그래밍의 4가지 특성과 SOLID 원칙

객체지향 프로그래밍은 여러 객체간의 상호작용을 통하여 하나의 소프트웨어의 동작 원리를 구성합니다. 객체가 프로그램 설계의 중심이 되기 때문에 이와 관련된 특징과 설계 원칙을 알아볼 필요가 있습니다.

객체지향 프로그래밍의 특징(OOP, Object-Oriented Programing)

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

  • 추상화
    • 추상화란 실세계의 대상 또는 개념의 공통적이고 본질적인 특징을 추출하여 정의한 것입니다.
    • 앞서 Chair.class의 형태에 대하여 살펴보았습니다. 이 때 클래스의 정의 부분 public class Chair entend Furniture을 살펴보면 Furniture 를 확장(extend) 하는 것을 알 수 있습니다. 여기서 Furniture는 가구를 추상화하여 정의한 abstract class입니다. Chair는 이 추상 객체를 기반으로 구현된 class라고 할 수 있습니다.
//Furniture abstract class
abstract class Furniture {
	//실세계의 대상인 '가구'를 추상화한 추상 객체 
    Furniture () {};
    Furniture (String material) {this.material = material}
    String material;
    ...
}

//Chair class
class Chair extends Furniture {
	//Furniture 추상 객체를 구체화한 Chair.class
    public Chair(){
    	super();
    }
    
    public Chair(String material){
    	super(material);
    }
    
    //추상 클래스를 구현한 클래스는 부모 클래스에 정의된 필드와 메소드를 사용할 수 있습니다.
    public String getMaterial(){
    	return this.material;
    }
    ...
    
}

이와 같이 하위(자식) 클래스에서 상위(부모) 클래스의 특징을 물려받는 것을 상속이라고 합니다.

  • 상속
    • 상속은 기존에 정의되었던 클래스를 재활용하여 새로운 클래스를 작성하는 것을 이야기합니다.
    • 상위 클래스를 상속받아 확장(extend)된 하위 클래스는 상위 클래스에 작성되어있는 속성과 메소드 뿐만 아니라 자신에게 정의된 속성과 메소드를 자유롭게 사용할 수 있습니다.
    • 이는 추상화의 연장선으로 반복적으로 사용되는 요소들은 추상화된 상위 객체에 정의하여 코드의 재사용성을 높히고 공통 속성에 손쉽게 접근하여 사용할 수 있도록 합니다.
//Furniture abstract class
abstract class Furniture {
	//실세계의 대상인 '가구'를 추상화한 추상 객체 
    Furniture () {};
    Furniture (String material) {this.material = material}
    String material;
    ...
}

//Chair class
class Chair extends Furniture {
	//Furniture 추상 객체를 구체화한 Chair.class
    public Chair(){
    	super();
    }
    
    public Chair(String material){
    	super(material);
    }
    
    //추상 클래스를 구현한 클래스는 부모 클래스에 정의된 필드와 메소드를 사용할 수 있습니다.
    public String getMaterial(){
    	return this.material;
    }
    ...
    
}

//Desk class
class Desk extends Furniture {
	//Furniture 추상 객체를 구체화한 Desk.class
    public Desk(){
    	super();
    }
    
    public Desk(String material){
    	super(material);
    }
    
    //추상 클래스를 구현한 클래스는 부모 클래스에 정의된 필드와 메소드를 사용할 수 있습니다.
    public String getMaterial(){
    	return this.material;
    }
}

위와 같이 추상 객체인 Furniture.class를 확장한 Chair와 Desk class 모두 상위 객체의 맴버 속성인 material을 사용할 수 있습니다.

또한 상위 객체에 정의된 속성을 하위 객체가 상속받아 사용할 때에 본인의 쓰임에 맞게 재정의 하여 사용할 수 있는 특성을 다형성이라고합니다.

  • 다형성
    • 다형성이란 어떤 객체의 기능이나 특징을 상황에 따라 여러가지 형태로 재정의할 수 있는 것을 의미합니다.
    • 같은 상위 클래스를 상속받은 A객체와 B객체가 있을 경우, 상위 클래스에 정의되어있는 특정 기능이 각 객체에서 서로 다르게 동작해야하는 경우가 있습니다. 이럴 때 메소드 재정의(메소드 오버라이딩, @Override / 메소드 오버로딩,@Overload)를 통하여 문제를 해결할 수 있습니다.
    //목수 인터페이스를 상속받은 chair와 desk 클래스의 특정 기능   override 예시
    • 다형성의 핵심은 상위 클래스 타입의 참조 변수를 사용하여 하위 클래스의 객체를 참조할 수 있다는 것입니다.
    // 참조 예시
    • 다형성의 활용1 (여러 타입의 객체를 상위 클래스 배열로 관리하는 경우)
    • 다형성의 활용2 (객체간 결합도를 낮춰 유지보수(변경) 향상)
  • 캡슐화
    • 객체지향 프로그래밍의 마지막 특성은 캡슐화입니다. 캡슐화는 서로 연관되어있는 속성과 기능을 하나의 캡슐로 감싸 외부로부터 보호하는 것을 의미합니다.
    • 캡슐화의 목적은 데이터 보호와 데이터 은닉입니다.
    • 외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적이
    • 캡슐화를 구현하기 위해서 자바에서는 접근제한자와 getter/setter를 사용 할 수 있습니다.
    • 접근 제한자 종류
      • public / private / protected / default
    //접근 제한자 종류와 접근 허용범위
    • getter / setter 사용으로 데이터 은닉
    // getter / setter 가 적용된 객체 내부 모습과 사용 예시

이상 객체지향 프로그래밍의 특징에 대한 첫번째 포스트를 마칩니다.
이후 두번째 포스트에서는 객체지향 프로그래밍의 설계 원칙인 SOLID 원칙에 대해 알아보도록 하겠습니다.

profile
2년차 백앤드 개발자입니다.
post-custom-banner

0개의 댓글