[Java] 객체 지향 프로그래밍

김선형·2025년 9월 6일

Java

목록 보기
5/27

절차적 프로그래밍 vs 객체 지향 프로그래밍

절차적 프로그래밍 (Procedural Programming)과 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 소프트웨어 개발의 두 가지 대표적인 패러다임이다.

구분절차적 프로그래밍객체 지향 프로그래밍
기본 개념순차적으로 명령어를 실행하여 문제 해결객체라는 단위로 데이터를 추상화하고,
그 객체 간 상호작용으로 문제 해결
구조함수 중심 (Function-based)클래스와 객체 중심 (Class-based)
데이터 처리데이터를 함수 외부에서 처리데이터를 객체 내부에서 캡슐화하여 처리
재사용성함수 재사용에 초점클래스/객체 단위로 재사용 및 상속
보안/은닉성데이터 보호 기능 부족 (전역 변수 사용 가능성 높음)정보 은닉 (Encapsulation) 제공
유지보수성복잡한 프로그램에서 유지보수 어려움캡슐화, 상속, 다형성으로 유지보수 용이
주요 개념순차, 조건, 반복캡슐화, 상속, 다형성, 추상화
대표 언어C, Pascal, Fortran, etc.Java, C++, Python, C#, etc.
실행 흐름위에서 아래로 순차적으로 흐름 제어객체 간 메시지 전달을 통해 흐름 제어
예제main() 함수에서 순차적으로 함수 호출클래스 생성 → 객체 생성 → 메서드 호출

Java OOP 핵심 용어

클래스 (Class)

객체를 만들기 위한 설계도로, 속성과 동작을 정의한다.

객체 (Object)

클래스를 기반으로 생성된 실체로, 어떤 클래스의 인스턴스이다. 속성과 메서드를 갖는 메모리 상의 실제 존재다.

속성 (Field)

클래스 내부에 선언된 변수로, 객체의 상태나 정보를 저장한다. 객체가 생성될 때 메모리에 할당되며, 각 객체는 독립적인 자신의 필드값을 가진다.

종류

  • 인스턴스 필드: 객체마다 독립적인 값을 가진다.
  • 정적 필드 (static): 클래스 전체에서 공유되는 값
  • 상수 필드 (final): 한 번 값이 정해지면 변경 불가능하다.

메서드 (Method)

객체가 수행하는 동작을 정의하는 함수다. 아래와 같은 형식으로 작성한다.

[접근제어자] [반환형] [메서드 이름](매개변수 목록) {
    // 메서드 본문
    return; // 반환형이 void가 아닌 경우
}

구성 요소

  • 접근 제어자: 외부에서 메서드 접근 가능 여부 (ex. public, private, protected,(default))
  • 반환형: 메서드 실행 후 반환하는 값의 타입
  • 메서드명: 동작을 나타내는 이름 (소문자로 시작)
  • 매개변수 (Parameter): 메서드에 전달되는 입력값
  • return문: 결과 반환 및 메서드 종료

생성자 (Constructor)

객체 생성 시 수행되는 초기화 메서드로, 클래스 이름과 동일하다.

캡슐화 (Encapsulation)

객체의 속성을 외부에서 직접 접근하지 못하도록 숨기고, 공개된 메서드를 통해서만 간접적으로 접근하도록 한다.

원칙

  • 필드는 private으로 선언한다.
  • 접근은 getter/setter를 통해 제공한다.
  • 필요 시 setter에 유효성 검사를 추가한다.

✏️ 필드 공개 vs 캡슐화

항목public 필드 직접 접근private + getter/setter (캡슐화)
접근 방식stock.price = 10000;stock.setPrice(10000);
간결성간단하고 빠름코드가 약간 길어짐
유효성 검사불가능 (값 제한 못함)setter에 검사 로직 가능
데이터 보호불안전 (외부에서 자유롭게 변경 가능)안전 (변경 제어 가능)
유지보수변경 시 외부 코드 모두 영향 받음내부 변경 시 외부 영향 최소화
기능 확장성어려움 (로직 삽입 불가)쉬움 (getter/setter에 로직 추가 가능)
OOP 원칙 준수객체지향 위반정보 은닉 원칙 충실
테스트 및 디버깅예기치 않은 변경 가능성 존재추적과 제어 쉬움

상속 (Inheritance)

기존 (부모) 클래스의 속성과 메서드를 새로운 (자식) 클래스가 물려받아 사용하는 개념이다. extends 키워드를 사용하며, 코드 재사용성 향상과 유지보수 편의성을 제공한다.

다형성 (Polymorphism)

하나의 타입으로 여러 형태의 동작을 표현할 수 있는 능력을 의미한다. 같은 메서드 호출이라도 객체의 실제 타입에 따라 다르게 동작하게 만드는 개념이다.

조건

  • 상속 (Inheritance): 자식 클래스가 부모 클래스를 상속해야 한다.
  • 오버라이딩 (Overriding): 자식 클래스가 부모의 메서드를 재정의해야 한다.
  • 업캐스팅 (Upcasting): 자식 객체를 부모 타입으로 참조한다.

추상화 (Abstraction)

복잡한 시스템에서 핵심적인 개념만을 추출하고, 불필요한 세부사항은 숨기는 것을 의미한다. abstract class 또는 interface를 사용하여 구현한다.

✏️ abstract class vs interface

항목추상 클래스 (abstract class)인터페이스 (interface)
용도상태와 일부 공통 구현을 자식들과 공유하기 위한 설계 도구구현 없이 동작 규약만 선언하여,
다양한 객체들이 동일한 역할을 수행할 수 있게 함
다중 상속불가능가능
필드인스턴스 변수, 생성자 포함 가능상수만 가능 (public static final)
메서드일부 구현 가능default, static 메서드 구현 가능

✏️ 패키지 (Package)?
관련 있는 클래스들을 논리적으로 묶는 단위. 일종의 폴더 구조이며, 클래스 간의 이름 충돌 방지, 접근 범위 관리, 재사용성 향상 등을 제공한다.
package com.company.project.model.user와 같이 소스 코드 상단에 패키지를 선언한다. 이 경우 com/company/project/model 폴더에 해당 클래스 파일이 실제로 존재한다.

✏️ 접근 제어자
클래스, 메서드, 필드, 생성자 등에 대해 외부에서의 접근 가능 범위를 제시하는 키워드로, OOP에서 정보 은닉을 구현하는 데 중요한 역할을 한다.

접근 제어자같은 클래스같은 패키지자식 클래스외부 클래스
publicOOOO
protectedOOOX
(default)OOXX
privateOXXX

defulat는 접근 제어자를 명시하지 않은 상태를 의미한다.
protected는 같은 패키지 또는 상속받은 클래스에서 접근 가능하다.

profile
선형의 비선형적 기록 🐜

0개의 댓글