Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가?

2025. 12. 1. 17:59·Archive/Daily Dev Q&A

Topic (오늘의 주제)

객체지향 프로그래밍 (Object-Oriented Programming, OOP)과 Java의 정체성


Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 객체지향이 아니면 코드가 절차적으로 길게 늘어져, 기능 하나를 수정할 때 연관된 모든 코드를 일일이 찾아 고쳐야 하는 '유지보수의 지옥'이 발생합니다.
  • 구조적 의미: **'높은 응집도(Cohesion)와 낮은 결합도(Coupling)'**를 가능하게 하여, 부품을 갈아 끼우듯 유연한 시스템 변경과 코드 재사용성을 보장합니다.
  • 면접 의도: 지원자가 단순히 '돌아가는 코드'를 짜는 것을 넘어, **'확장 가능하고 유지보수가 쉬운 설계'**를 할 수 있는 개발자인지 판단하기 위함입니다.

Core Concept (핵심 개념 정리)

객체지향은 현실 세계의 사물(Object)을 프로그래밍으로 옮겨와, 객체들 간의 상호작용으로 로직을 구성하는 방법론입니다.

1. 주요 구성 요소 및 특징

요소 내용
개념 정의 데이터(상태/Field)와 그 데이터를 조작하는 코드(행위/Method)를 하나의 **객체(Object)**로 묶어서 생각하는 프로그래밍 패러다임입니다.
핵심 4대 원칙 1. 캡슐화 (Encapsulation): 데이터와 기능을 하나로 묶고, 외부에서 함부로 접근하지 못하게 보호함 (Information Hiding).

2. 상속 (Inheritance): 부모 클래스의 기능을 자식이 물려받아 재사용 및 확장함.

3. 다형성 (Polymorphism): 같은 이름의 메서드가 상황에 따라 다르게 동작함 (Overloading, Overriding).

4. 추상화 (Abstraction): 불필요한 세부 정보는 숨기고, 중요한 특징(공통점)만 뽑아내어 모델링함.
동작 방식 설계도인 **클래스(Class)**를 정의하고, new 키워드를 통해 메모리(Heap)상에 실체인 **인스턴스(Instance)**를 생성하여 서로 메시지(메서드 호출)를 주고받습니다.
장점 코드의 재사용성이 높고, 모듈화가 되어 있어 유지보수와 대규모 개발에 유리합니다.
단점 설계 단계에서 시간이 오래 걸리며, 객체 생성과 메시지 전달 과정에서 절차지향 언어(C언어 등)보다 실행 속도가 미세하게 느릴 수 있습니다.

2. 왜 JAVA는 객체지향 언어인가?

Java는 태생부터 OOP를 위해 설계된 언어입니다.

  1. 클래스 기반: Java의 모든 코드는 Class 안에 존재해야 합니다. 심지어 메인 함수(public static void main)조차 클래스 내부에 있어야 실행됩니다.
  2. 캡슐화 지원: private, protected, public 접근 제어자를 통해 강력한 정보 은닉을 지원합니다.
  3. 상속과 다형성: extends, implements 키워드와 인터페이스를 통해 객체지향의 꽃인 다형성을 언어 차원에서 강력하게 지원합니다.
  4. JVM의 객체 관리: JVM은 Heap 영역에서 객체(인스턴스)의 생명주기를 관리하며, 개발자가 직접 메모리를 해제하지 않아도 되는(Garbage Collection) 객체 친화적 환경을 제공합니다.

Interview Answer Version (면접 답변식 요약)

"객체지향 프로그래밍(OOP)은 프로그램을 수많은 명령어의 순서가 아닌, 데이터와 행위를 가진 '객체'들의 상호작용으로 파악하는 개발 방식입니다.

캡슐화, 상속, 다형성, 추상화라는 4가지 특징을 가지며, 이를 통해 코드의 재사용성을 높이고 유지보수를 용이하게 만듭니다.

특히 Java는 모든 코드가 클래스 기반으로 작성되어야 하며, 상속과 인터페이스를 통해 다형성을 언어 차원에서 강력하게 지원하기 때문에 대표적인 객체지향 언어라고 할 수 있습니다."


Practical Tip (사용시 주의할 점 or 활용 예)

실무에서 OOP를 적용할 때 가장 주의해야 할 점은 **'잘못된 상속의 사용'**입니다.

  • 상속보다는 조립(Composition)을 사용하라:
    • 상속은 부모와 자식 간의 결합도를 매우 높입니다. 부모 클래스가 변경되면 자식 클래스 전체에 영향을 미칩니다.
    • 따라서 무조건적인 extends보다는, 필요한 객체를 필드(변수)로 가지고 와서 사용하는 조립(Composition) 방식이 더 유연한 경우가 많습니다.
  • Getter/Setter의 남용 주의 (캡슐화 파괴):
    • 습관적으로 모든 필드에 Setter를 만들면, 외부에서 객체의 상태를 마음대로 바꿀 수 있어 캡슐화의 의미가 퇴색됩니다.
    • 데이터를 그냥 꺼내서(get) 외부에서 계산하지 말고, 객체에게 일을 시키는(calculate) 메서드를 만드는 것이 진정한 객체지향입니다.
    Java
     
    // Bad Practice (절차지향적 사고)
    User user = new User();
    if (user.getAge() >= 20) { ... } // 데이터만 가져와서 밖에서 판단함
    
    // Good Practice (객체지향적 사고)
    if (user.isAdult()) { ... } // 객체에게 "성인인지 판단해줘"라고 메시지를 보냄
    

예상 꼬리질문 정리

  1. OOP의 5대 원칙(SOLID)에 대해 설명해주실 수 있나요?
    • 객체지향 설계를 더 견고하게 만들기 위한 5가지 원칙(단일 책임, 개방-폐쇄, 리스코프 치환, 인터페이스 분리, 의존관계 역전)에 대한 이해가 필수입니다.
  2. 추상 클래스(Abstract Class)와 인터페이스(Interface)의 차이점은 무엇이며, 각각 언제 사용하나요?
    • Java 8 이후 인터페이스 기능 강화(default method)로 경계가 모호해졌지만, '기능의 확장(상속)'과 '행위의 보장(구현)'이라는 설계 의도의 차이를 묻는 질문입니다.
  3. 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이는 무엇인가요?
    • 다형성의 구체적인 구현 방식을 구분할 수 있는지 확인하는 기본 질문입니다. (같은 이름 다른 매개변수 vs 상속받은 메서드 재정의)

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: 다형성  (0) 2025.12.03
Daily Dev Q&A: 상속과 컴포지션(Composition)의 차이와, 언제 컴포지션을 사용하는가?  (0) 2025.12.02
Daily Dev Q&A: 자바의 예외 처리(Exception) 구조  (0) 2025.11.28
Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?  (0) 2025.11.28
Daily Dev Q&A: 자바의 메모리 구조  (0) 2025.11.26
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: 다형성
  • Daily Dev Q&A: 상속과 컴포지션(Composition)의 차이와, 언제 컴포지션을 사용하는가?
  • Daily Dev Q&A: 자바의 예외 처리(Exception) 구조
  • Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    프로젝트회고
    경기기후바이브코딩
    network
    SpringBoot
    REACT
    til
    OrphanRemova
    클로드코드
    backend
    DevFestIncheon2025
    Project_Review
    jpa
    devlog
    데브페스트
    커리어리셋
    Spring비교
    java
    spring
    프로덕트개발자
    aws_s3
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가?
상단으로

티스토리툴바