객체 지향 프로그래밍(Object-Oriented Programming)은 필요한 데이터를 객체(Object)라고 하는 단위로 구성하는 프로그래밍 방법입니다. 객체에는 데이터와 해당 데이터를 처리하는 메소드가 포함될 수 있으며, 이러한 객체가 모여 프로그램을 구성합니다.
그럼 객체란 무엇일까요?
클래스의 인스턴스(instance)로, 실제로 메모리에 할당된 데이터입니다. 객체는 클래스에서 정의한 속성과 동작을 가지고 있습니다.
객체와 인스턴스
만약 우리가 School 이라는 클래스에서 student라는 객체를 만들고 싶다면
School student = new School() 이렇게 new 키워드로 객체를 생성할 수 있습니다.
인스턴스라는 말은 특정 객체(student)가 어떤 클래스(School)의 객체인지를 관계 위주로 설명할 때 사용됩니다.
student는 인스턴스 X -> student는 객체 O
student는 School의 객체 X -> student는 School의 인스턴스 O
객체 지향 프로그래밍의 특징
1. 추상화
객체에서 공통된 속성과 동작을 찾아 불필요한 세부사항을 숨기고, 중요한 개념이나 기능에 집중한 프로그램을 구현하는 것을 말합니다.
자바에서 추상화 구현의 문법적인 요소로는 추상 클래스와 인터페이스가 존재합니다.
만약 '자동차'라는 인터페이스가 존재한다면, 우리는 새로운 모델의 자동차가 추가되어도 추상화로 '자동차'라는 큰 역할이 인터페이스라는 이름으로 정의가 되어있기 때문에, 해당 인터페이스를 구현하는 각 객체들은 새로운 모델에 대해서 구현을 할 수 있게 됩니다. 이렇게 다른 코드를 수정할 필요없이 필요한 부분만 생성하고 대체하면 되기 때문에 추상화가 필요합니다.
2. 상속
하나의 클래스가 다른 클래스의 속성과 메소드를 물려받는 것을 말합니다.
추상화를 통해 상위 클래스에 공통된 속성과 기능을 정의하고 하위 클래스들은 상위 클래스를 상속받아 반복적으로 기능을 정의하는 번거로움을 제거할 수 있습니다. 이때 extends 키워드를 통해 각 하위 클래스로 확장이 가능합니다.
상속의 경우 상위 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용할 수 있는 반면, 인터페이스를 통한 구현은 반드시 인터페이스에 정의된 추상 메서드의 내용이 구현체인 하위 클래스에서 반드시 정의되어야 합니다.
3. 다형성
어떤 객체의 속성이나 동작이 또 다른 역할을 수행할 수 있는 객체 지향의 특성입니다.
주로 메소드 오버로딩과 메소드 오버라이딩으로 구현됩니다.
메소드 오버로딩 : 같은 이름의 메소드를 여러 형태로 정의하는 것
메소드 오버라이딩 : 상속받은 메소드를 서브클래스에서 재정의하는 것
특히나 객체 지향에서 다형성이 갖는 또 다른 의미는 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있는것을 얘기합니다. 위에서 본 대로 상위 클래스 타입의 참조변수가 하위 클래스의 객체를 참조할 수 있다는 의미입니다.
4. 캡슐화
객체의 데이터를 외부로부터 보호하고, 데이터에 접근하는 메서드를 제공하는 것입니다.
아래 코드를 보면 Person 클래스에서 name과 age 필드는 private으로 선언되어 외부에서 직접 접근할 수 없으며, 대신 public 메서드인 getter와 setter를 통해 접근합니다.
이런식으로 접근제어자를 통해 데이터를 보호하고 은닉할 수 있으며 getter/setter 메소드로 데이터에 접근할 수 있습니다.
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
참고자료 :
https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징
https://jongminfire.dev/객체지향-프로그래밍이란
'백엔드 TIL' 카테고리의 다른 글
[Docker] 도커란? 도커파일(Docker File) 개념과 작성법 (0) | 2024.07.30 |
---|---|
[TDD] TDD 방법론, 테스트 주도 개발 (0) | 2024.07.17 |
[Spring] Spring과 좋은 객체 지향 프로그래밍에 대해서 (0) | 2024.07.09 |