티스토리 뷰

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

Intro. 프로그래밍 패러다임을 조곰 알고가자

객체 지향 프로그래밍(Object-Oriented Programming, OOP)과 절차 지향 프로그래밍(Procedural Programming)은 두 가지 다른 프로그래밍 패러다임입니다.

절차 지향 프로그래밍

  • 순차적인 프로그래밍 접근 방식
  • 프로그램이 일련의 절차 또는 단계에 따라 실행
    • 이러한 절차는 종종 함수 또는 프로시저로 묶임
    • 절차 지향 프로그래밍의 주요 목표는 프로그램의 흐름을 제어
  • Ex. C 언어

객체 지향 프로그래밍

  • 프로그램을 여러 개의 독립적인 객체로 구성하는 프로그래밍 접근 방식
  • 객체는 데이터와 이 데이터를 조작하는 메소드를 포함
  • 객체 지향 프로그래밍의 주요 목표는 프로그램 내에서 객체 간의 상호작용을 통해 문제를 해결하는 것
    • 객체 지향 프로그래밍에서는 상속, 다형성, 캡슐화와 같은 특징을 활용하여 프로그램의 재사용성, 유지보수성 및 확장성을 향상시킵니다.
  • Ex. ava, C++, C#, Python, JavaScript 등

객체 지향 프로그래밍의 구성 요소

객체 지향 언어에서 객체, 메소드, 함수는 다음과 같은 의미를 가지고 있습니다.

  1. 객체(Object)
    1. 객체 지향 프로그래밍에서 기본 단위로
    2. 현실 세계의 사물이나 개념을 프로그램 내에서 모델링한 것입니다
    3. 객체는 상태와 행동을 갖습니다.
      1. 상태는 객체의 속성(예: 색깔, 크기 등)을 나타내며, 행동은 객체의 메소드로 표현됩니다.
      2. 객체는 독립적이며, 다른 객체와 상호작용할 수 있습니다.
  2. 메소드(멤버 함수)(Method)
    1. 객체의 행동을 나타내는 함수
    2. 객체의 속성을 조작하거나 다른 객체와 상호작용하는 데 사용됩니다.
    3. 메소드는 객체에 속하며, 일반적으로 객체의 속성에 대한 접근 제어를 제공합니다.
    4. 메소드는 객체의 인스턴스에 대해 호출됩니다
  3. 함수(Function)
    1. 하나의 기능을 수행하는 일련의 코드
    2. 호출 된 함수는 기능이 끝나면 제어가 반환됩니다
    3. 함수는 인자를 받아 결과를 반환하며, 코드의 재사용성을 높이고 가독성을 개선하는 데 도움이 됩니다.

메소드와 함수는 뭐가 다른가요?
함수는 독립적인 코드 블록으로 작동합니다.
메소드는 객체에 속하고 객체의 행동을 정의하며 객체에 속한 함수라 볼 수 있습니다.

클래스 ⇒ 추상화

public class UserInfo{
	// 멤버 변수
	String userId;
	int userPassword;
	
	// 디폴트 생성자
	public UserInfo(){}//
	
	// 정의된 생성자
	public UserInfo(String userId){
		this.userId = userId;
	}
	// 함수+접근 제어
	public void getUserPassword(String userId){
		return userPassword
	}
}

생성자

객체가 생성 될 때 변수나 상수를 초기화하거나 다른 초기화 기능을 호출하는 메소드입니다

  • 클래스에는 반드시 적어도 하나 이상의 생성자가 존재합니다
  • 생산자는 반환 값이 없다
  • 클래스의 이름과 동일
  • 일반 함수처럼이 아니라, new와 함께 호출

기본 생성자

  • 만약 클래스에 생성자가 하나도 없다면, 컴파일러가 기본 생성자를 만들어줍니다
  • 매개 변수가 없고, 구현부가 없습니다

접근 제어자

  • 클래스 외부에서 클래스의 멤버들을 사용할 수 있는지 여부를 지정하는 키워드
  • private
    • 같은 클래스 내부에서만 접근 가능
  • default
    • 같은 패키니 내부에서만 접근 가능
  • protected
    • 같은 패키지나 상속 관계의 클래스에서만 접근 가능
  • public
    • 클래스의 외부 어디서나 접근 할 수 있음

객체 생성

public class UserInfoTest{
	public static void main(String[] args ){
		UserInfo userInfo = new UserInfo("rhqjatn");
	} 	
}

클래스는 객체의 속성을 정의하고, 기능을 구현해 놓은 상태입니다

  • 실제 클래스 기반으로 생성된 객체(인스턴스) 각각 다른 멤버 변수 값을 가지게 됩니다
  • new 키워드를 사용하여 인스턴스를 생성합니다
  • 생성 된 객체는 동적 메모리에 할당 됩니다

This

this는 객체 자신 즉 자신의 인스턴스 메모리를 가리킵니다.
this를 사용하는 가장 큰 이유는 명확히 자신을 구분하기 위해서입니다

  • 생성자에서 또 다른 생성자 호출을 할 때 구분 하기 위함
  • 자기 자신 객체를 반환 할 때도 사용합니다( [객체].this )

Static : 여러 인스턴스의 공통 인수

static은 여러 객체에서 동일한 변수를 접근해야 할 때 사용합니다

  • static은 프로그램이 프로세스가 되어 메모리에 실행 되는 순간 생깁니다
  • 객체 인스턴스가 아닌, 프로세스가 끝나고 메모리에서 내려올 때 사라집니다
  • 주로 싱글톤 패턴(한 클래스의 인스턴스를 1개로 유지하는 전략)에서 많이 사용됩니다

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

정보 은닉

public void setMonth(int month){
	if(month < 1 || month >12){
		isValid = false;
	}
	else{
		this.month = month;
	}
}
  • 변수가 private 일 때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다
  • 외부에 최소한 필요한 정보만을 공개하여, 객체의 오류를 방지 및 효율적인 객체 관리를 합니다
public class Birth{
	private int day;
	private int month;
	private int year;

	public int getDay(){
		return day;
	}
	public void setDay(int day){
		this.day = day;
	}
}

정보 은닉에 대한 아이디어는 곳곳에 존재합니다.
getter와 setter도 그 예시입니다.
위의 메소드들을 통해 객체의 데이터의 잘못된 수정 입력을 로직으로 방어 할 수 있습니다.
위의 코드에서 개발자는 in/out에 대한 값을 신뢰 할 수 있게 됩니다

캡슐화

  • 꼭 필요한 정보와 기능만 외부에 오픈
  • 외부에 통합된 인터페이스만 제공하여 일관된 기능을 구현

객체 지향 설계에서 캡슐화 전략은 다양하고 중요합니다.
어디까지 보여 줄 것인가? 어디까지 정보를 제공함으로 효율적인 프로그램을 개발할 수 있을지 고민 할 필요가 있습니다

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90