Programming Languages/Java

[JAVA] 객체 지향 언어(Object-Oriented Programming, OOP) 란?

Hannana. 2024. 2. 8. 11:25
반응형

자바는 객체 지향 언어(Object-Oriented Programming, OOP)이다.

 

 

객체 지향 언어(Object-Oriented Programming, OOP) 란?

  현실 세계의 개체를 프로그램으로 표현하고 이러한 개체 간의 상호 작용을 통해 소프트웨어를 개발하는 방법론. 클래스를 사용하여 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶고, 이를 통해 모듈화되고 재사용 가능한 소프트웨어를 구축할 수 있다.

 

 

-절차적 프로그래밍 방식 => 순서대로만 처리하고 결과를 내는 방식

-구조적 프로그래밍 방식 => 프로그램을 함수단위로 나누고 함수끼리 호출하는 방식으로, 큰 문제를 해결하기 위해 문제를 작은 단위들로 나누어 해결한다. (Top-Down 방식)

-객체 지향 프로그래밍 방식 => 구조적 프로그래밍 방식의 개선된 형태로, 객체들을 조합해 큰 문제를 해결한다. (Bottom-Up 방식)

 

 

 

객체 지향 언어는 객체 지향 프로그래밍 방식의 특성을 가진 언어라고 볼 수 있다.

 

 

 

 

 

OOP는 크게

  • 클래스(Class)
  • 객체(Object)
  • 상속(Inheritance)
  • 다형성(Polymorphism)
  • 캡슐화(Encapsulation)

등의 개념을 포함한다.

 

쪼개어 자세히 개념을 살펴보자.

 

 

 


 

1. 구성

 

클래스(Class) 

: 클래스는 속성(attribute)과 메서드(method)로 구성된 개념적인 틀이다. 데이터와 해당 데이터를 조작하는 메서드를 하나의 단위로 취급하여 클래스라는 구조로 정의한다.

class Car { String color; int speed; 
void drive() { // 운전하는 기능 구현 } void stop() { // 정지하는 기능 구현 } }

 

 

 

객체(Object)

: 클래스를 기반으로 실제로 메모리에 할당된 인스턴스를 의미한다. 클래스는 개념, 구현은 객체라고 생각하면 쉽다.

각 객체는 독립적으로 데이터를 유지하고 메서드를 실행할 수 있다.

Car myCar = new Car(); 
myCar.color = "Red"; 
myCar.speed = 60; myCar.drive();

 

기본적인 구성은 위 설명과 같이 클래스와 객체로 이루어졌다.

그렇다면 메소드는 무엇일까?

 

 

 

▷ 메소드(Method)

: 클래스 내부에 정의된 함수 또는 동작을 나타낸다. 메서드는 클래스의 특정 기능을 수행하거나 작업을 처리하는 데 사용된다. 쉽게 말해 클래스 내부의 동작! movement를 정의하는 것이다. 

메소드는 다른 이름 혹은 같은 이름으로도 여러 개 정의할 수 있고, 클래스 이름과 같게 지정할 수도 있다.

여기서 클래스 이름과 같게 지정한 메소드를 "생성자" 라고 하는데,

"생성자"는 다음과 같은 특징을 갖는다.

 

 


-객체(인스턴스)를 생성할 때 객체의 초기화를 담당하며, 주로 객체의 멤버 변수를 초기화하는 데 사용됨
-반환 값X
-객체를 생성할 때 new 키워드와 함께 호출되어, 객체가 생성되는 동시에 생성자가 실행
-동일한 클래스에 여러 개의 생성자를 정의할 수 있음
-오버로딩 가능(같은 이름 여러개)

 

 

 

 

예를 들어보자.

public class Car {
    String color;
    int speed;

    // 기본 생성자
    public Car() {
        color = "White";
        speed = 0;
    }

    // 매개변수를 가지는 생성자
    public Car(String c, int s) {
        color = c;
        speed = s;
    }
}

 

 이렇게 같은 이름의 생성자여도, 매개변수의 유무로 두 번 정의할 수 있는 것이다.

호출 시에도 다르게 인식되어 호출된다.

 

 

이렇게 클래스 안에 멤버 변수와 메소드로 구성이 되고, 그것을 구현한 개념이 객체(인스턴스)라면

이 OOP의 특징은 뭐가 있을까?

 

 

 

 

 

 

 

 

2. 특징

 

◎  상속(Inheritance)

: 클래스를 기반으로 실제로 메모리에 할당된 인스턴스를 의미한다. 클래스는 개념, 구현은 객체라고 생각하면 쉽다.

각 객체는 독립적으로 데이터를 유지하고 메서드를 실행할 수 있다.

class SportsCar extends Car { // 추가적인 속성과 메서드 정의 가능 }

 

 

 

◎ 다형성(Polymorphism)

: 같은 이름의 메서드가 서로 다른 동작을 수행할 수 있는 능력을 의미한다. 상속, 추상화, 인터페이스 등의 개념과 함께 사용된다.

class Animal { 
	void makeSound() { 
    	System.out.println("Animal makes a sound");
       } 
  } 
  
  class Dog extends Animal { 
  	void makeSound() { 
    	System.out.println("Dog barks"); 
        } 
  } 
  class Cat extends Animal { 
  	void makeSound() { 
    	System.out.println("Cat meows"); 
    }
}

 

-오버로딩(Overloading) : 하나의 클래스에서 메소드의 이름이 같지만, 파라메터가 다른 것
-오버라이딩(Overriding) : 부모 클래스의 메소드를 용도에 맞게 재정의한 것

 

 

 

 

 

캡슐화(Encapsulation)

: 데이터와 해당 데이터를 조작하는 메서드를 하나로 묶어서 외부로부터의 접근을 제어하는 개념.

클래스의 내부 구현을 외부로부터 감춤으로써 데이터의 무결성을 보장한다.

class Animal { 
	void makeSound() { 
    	System.out.println("Animal makes a sound");
       } 
  } 
  
  class Dog extends Animal { 
  	void makeSound() { 
    	System.out.println("Dog barks"); 
        } 
  } 
  class Cat extends Animal { 
  	void makeSound() { 
    	System.out.println("Cat meows"); 
    }
}

 

 

 

 

 

 

 

 

 

3-1. 장점

 

-소프트웨어의 모듈화, 재사용성, 유지보수성을 향상
-복잡성을 단순화하여 프로그래밍을 보다 효율적으로 수행할 수 있도록 도와줌

 
 
 

 

3-2. 단점

 
-파이썬과 같은 스크립트 언어에 비해 실행 시간이 오래 걸리고,
-설계 시에도 품이 많이 듬..
 
 
 
 
 
 
 
 
 

4. 번외)  OOP의 5원칙 (SOLID)

: 마이클 패더스가 소개한 SOLID라는 약어로 소개한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙.
 
  • S (SRP : Single Responsibility Principle)
    한 클래스는 하나의 책임만 가져야 한다.

 

  • O (OCP : Open/Closed Principle)
    확장에는 열려(Open) 있으나, 변경에는 닫혀(Closed)있어야 한다.

 

  • L (LSP : Liskov’s Substitution Principle)
    프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

 

  • I (ISP : Interface Segregation Principle)
    특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

 

  • D (DIP : Dependency Inversion Principle)
    추상화에 의존한다. 구체화에 의존하면 안된다.


 
 
 
 
 
 
 
 

 

반응형