객체지향 프로그래밍 (Object-Oriented Programming)

바다·2024년 4월 17일
0

CS

목록 보기
1/2
post-thumbnail

객체지향 프로그래밍이 뭘까?

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.

  • 각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있다.
  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들이 때문에 대규모 소프트웨어 개발에 많이 사용된다.

유연하고 변경이 용이하게?

  • 레고 블럭 조립하는 것처럼
  • 키보드, 마우스 갈아 끼우는 것처럼
  • 컴포넌트를 쉽고 유연하게 개발할 수 있는 방법

그래서 객체가 뭔데?

  • 객체는 객체 지향 프로그래밍의 가장 기본적인 단위이자 시작점
  • 객체지향 개념의 가장 기본적인 전제는 실제 세계는 객체들로 구성되어 있으며, 보여지는 모든 현상과 발생하는 모든 사건은 이러한 객체들 간의 상호작용을 통해 발생한다는 것에서 출발
class Phone {
	//속성 정의
    String user;
	String company;
    String model;
    String color;
    int battery;
    
    //기능 정의
    void startPhone() {
    	System.out.println("휴대폰이 켜집니다.");
    }
    
    void chargePhone() {
    	this.battery++;
    }
    
    void  call(Phone phone) {
    	System.out.println(phone.user + "에게 전화를 겁니다.");
    }  
}

객체 지향 프로그래밍에서는 이와 같은 각각의 객체를 추상화시켜 속성(state)과 기능(behavior)으로 분류한 후 이것을 다시 각각 변수(variable)와 함수(function)로 정의하고 있다

클래스와 객체에 관한 글 👉 여기서 보기

객체 지향 프로그래밍의 4가지 특징

  • 추상화
  • 상속
  • 다형성
  • 캡슐화

1. 추상화 (Abstraction)

객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출 해내는 작업
추상적인 개념에 의존하여 설계해야 유연함을 갖출 수 있다. 즉, 세부적인 사물들의 공통적인 특징을 파악한 후, 하나의 묶음으로 만들어내는 것이 추상화

고양이, 강아지, 호랑이
👉 짖을 수 있음, 움직일 수 있음, 먹을 수 있음 (공통적 특징)
👉 동물임

public interface Animal {
	void bark();
    void move();
    void eat();
}

자바에서 추상화를 구현할 수 있는 문법 요소로는 추상 클래스(abstract class)와 인터페이스(interface)가 있다. 이 두 개념은 아래의 글에 (무려 1년 전) 정리해두었다!
👉 여기서 보기

2. 상속(Inheritance)

기존의 클래스를 재활용 하여 새로운 클래스를 작성하는 자바의 문법 요소
추상화의 연장선에서, 상속은 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능을 간편하게 사용할 수 있도록 한다

그래서 이게 왜 좋은데요?

  • 클래스들 간 공유하는 속성과 기능을 반복적으로 정의할 필요가 없음!
  • 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근 가능!
고양이, 강아지 비교

공통 기능 : 짖기, 움직이기, 먹기 👉 이것들을 한 번만 작성해두면 여러 번 재활용 가능

고양이만 가진 기능 : 냥냥 펀치
강아지만 가진 기능 : 산책

자바에서의 상속을 정리한 글 👉 여기서 보기

3. 다형성(Polymorphism)

어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태 를 가질 수 있는 성질을 의미
서로 다른 클래스의 객체가 같은 동작 수행을 명령을 받았을 때, 각자의 특성에 맞는 방식으로 동작 하는 것

public interface Animal {
	void bark();
}

public class Dog implements Animal {
	@Override
    public void bark() {
    	System.out.println("멍멍");
    }
}

public class Cat implements Animal {
	@Override
    public void bark() {
    	System.out.println("야옹");
    }
}

OOP에서 다형성의 개념을 구현할 수 있는 방법은 오버라이딩(Overriding)과 오버로딩(Overloading) 이 있다.
오버라이딩과 오버로딩에 대해 정리한 글 👉 여기서 보기
다형성에 대해 정리한 글 👉 여기서 보기

4. 캡슐화(Encapsulation)

클래스 안에 서로 연관 있는 속성과 기능들을 하나의 캡슐(capsule) 로 만들어 데이터를 외부로부터 보호하는 것
정보 은닉화를 통해 높은 응집도, 낮은 결합도 를 유지할 수 있도록 설계하는 것

왜 캡슐화를 하나요?

  • 데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호
  • 데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출

어떻게 캡슐화를 하나요?

  • 접근제어자 활용
    접근제어자는 클래스 또는 클래스 내부의 멤버들에 사용되어 해당 클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제한하는 역할
    public, default, protedted, private
  • getter/setter 메서드 활용
    아래의 예제에서는 모든 속성값들이 private 접근 제어자로 선언되어 있고, getter/setter 메서드의 접근제어자만 public으로 열려있다
    외부에 접근을 허용할 속성과 그렇지 않을 속성을 getter/setter 메서드를 통해 서정해줄 수 있다
public class Phone {
	private String name;
    private String number;
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public String getNumber() {
    	return number;
    }
    
    public void setNumber(String number) {
    	this.number = number;
    }
}
profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글