Java, 객체지향 프로그래밍(OOP)이란?

하히호호·2024년 4월 2일
0

자바는 클래스로 시작해서 클래스로 끝난다.

Java는 대표적인 객체지향 프로그밍 언어이다.

객체지향 프로그래밍 언어는 OOP로 명칭하는데 Object - Oriented Programming의 약자이다.

객체지향 프로그래밍의 가장 큰 특징은 자원의 재활용성이다.
프로그램의 작은 문제들을 해결할 수 있는 기능이 있는 객체를 만든 뒤, 객체들끼리 상호작용으로 서술하는 방식으로 문제를 해결하는 상향식(bottom-up)프로그램 작성 기법이다.

조금 쉽게 풀어보자면, 객체지향 프로그래밍이란 조립이라고 생각할 수 있다.
작은 레고(객체)를 적재적소하게 사용하여 프로그램을 만드는 것이다.


용어 정리

  • 클래스(Class)
    클래스는 객체를 생성하기 위한 설계도이다. 객체의 속성(상태)이나 행위(method) 를 적어두는 것이다.
    흔히 붕어빵 틀, 공장으로 많이 비유한다. 자주 사용하는 기능을 클래스로 만들어 놓는다면
    의미없는 코드 반복을 하지 않는다.
    main아닌 클래스는 "기능 창고"라고 생각하자.

    클래스를 왜 만드나요?
    무엇보다 강조되어야하는 것은 자원의 재활용성이다.

  • 객체
    클래스를 통해 생성된 인스턴스, 실체이다. 메서드와 변수의 묶음이라 표현할 수있다.
    실제 프로그램 내에서 메모리에 항당된 상태를 가지고 있으며 실행 가능한 어떤 것을 말한다.
    클래스에서 정의된 필드와 동일한 속성(상태)와 메서드(행위)를 가진다.

  • 인스턴스
    클래스로부터 생성된 객체를 의미하는데,
    객체가 메모리에 할당되어 실제로 생성된 상태를 강조할때 사용한다. 해당 클래스와의 관계를 더욱 강조할 때 말한다.

용어 차이

  • 객체는 클래스의 정의를 통해 메모리에 할당된 구체적인 실체이다.
  • 인스턴스는 객체가 메모리에 할당되어 실제로 생성된 것을 강조할때 사용한다.
  • 메서드
    클래스 안에 구현된 행위에 대한 함수이다. 객체의 속성(move(), rightClick()..)을 정의해둔 묶음을 의미한다.
    멤버 변수를 이용한다.

  • 멤버변수
    클래스의 속성, 특성(데이터)을 의미한다.



클래스 사용 예시 코드

[Ex1Car 클래스]

public class Ex1Car {
	int wheel;
    public String irum;
    
    public Ex1Car() {
    	System.out.println("생성자: 객체 생성시 초기화를 담당. 1회 호출됨");
		wheel = 4;
    }
}

[Main 클래스]

public class Ex1Main {
	public static void main(String[] args) {
    //자동차 객체를 만들고 싶다.
		Ex1Car car1 = new Ex1Car();
        System.out.println("바퀴 수: "+car1.wheel);
    }
}

결과값
생성자: 객체 생성시 초기화를 담당. 1회 호출됨
바퀴 수: 4

어플리케이션의 시작점은 main메서드이다.
위에서 잠시 언급했듯 main메서드가 있는 클래스가 아닌 클래스들은 기능 창고들이다. 스스로 run할 수 없다.

클래스 생성자 (constructer)

위의 코드 Ex1Car클래스를 살펴보면,
public Ex1Car(){ ... }라는 생성자가 있다.

생성자란?

객체 생성시 초기화를 담당한다.
생성자는 클래스와 이름이 같고 반환값이 없다.
생성자가 없을 경우, java에서 자동으로 생성자를 만들어준다.
없어도 되는 것은 아니지만 생략이 가능하다.

객체지향 4가지 특징

1. 캡슐화

캡슐화의 가장 큰 장점은 정보은닉이다.
접근제어자를 통해 원하는 범위를 설정해 정보를 은닉하거나 공개할 수 있다.

  • public : 같은 프로젝트 내에서 유효하다. 패키지가 달라도 된다.
  • protected : 같은 프로젝트 내에서 유효하다. 패키지가 다른 경우, 자식 클래스만 유효
  • default : 같은 패키지 내에서만 유효
  • private : 현재 클래스 내에서만 유효, 다른 클래스에서는 참조 불가

2. 추상화

어떠한 클래스의 공통 자원들의 뼈대만을 나타내어(구현x) 상속받아 사용하는 기능이다.
abstract 예약어를 사용한다.
클래스 내부에 구현한 클래스로 클래스 내부에서만 사용하기 위해 선언한느 클래스이다.

3. 상속성

부모 클래스의 특성과 기능을 자식 클래스에서 상속받아 사용할 수 있게 해주는 기능이다. 이를 통해 캡슐화를 유지하면서 클래스의 재사용성을 높여준다.

4. 다형성

하나의 함수가 상황에따라 다른 값을 return할 수 있도록 한다.
객체지향 프로그래밍의 꽃(유연성, 재활용성, 유지보수성의 기본)이라고 할 수 있는 특징이다.

  • 오버라이딩
    상속받은 기능을 자식 클래스에서 재변경하여 사용하는 방법
    기존 것을 덮어버리는 개념이다.(상속의 개념이 기반)
  • 오버로딩
    이름만 동일하고 매개변수의 개수를 다르게 받아 메서드를 다양하게 사용할 수 있게 하는 방법

객체 지향 프로그래밍의 장단점

장점

  • 코드의 재사용성
  • 유지보수성
  • 보안성
  • 확장성

단점

  • 복잡성, 클래스 및 객체 관리 필요

객체 지향 설계 원칙(SOLID)

객체 지향에 관한 설계 원칙이 5가지가 있다.

SRP(Single Responsibility Principle) 단일 책임 원칙

클래스는 하나의 책임만 가져야하며, 그 책임(목적)을 변경하는 이유는 하나여야한다.

OCP(Open/Closed Principle) 개방/폐쇄 원칙

클래스, 모듈, 함수 등 확장에는 열려있어야하고, 수정에는 닫혀있어야 한다.
클래스를 수정해야한다면 그 클래스를 상속하여 수정한다.

LSP(Liskov Substitution Principle) 리스코프 치환 원칙

하위 타입은 상위 타입을 대체할 수 있어야한다. 즉, 부모 클래스 객체를 대체하더라도 프로그램의 의미나 동작은 변하지 않아야 한다.

ISP(Interfae Sefrefation Principle) 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않은 메서드에 의존 관계를 맺으면 안된다.

DIP(Dependency Inversion Principle) 의존성 역전 원칙

고수준 모듈은 저수준 모듈에 의존해서는 안되며, 두개 모두 추상화에 의존해야한다.

profile
읽히는 코드를 짜고싶습니다.

0개의 댓글