[CS] 자바의 정석 독서 #6 - 객체지향 프로그래밍, OOP란 무엇인가?

2025. 9. 24. 14:55·언어공부/Java | Kotlin

 

3장까지 읽었고 4,5장이 남았는데 거기는 반복문, 조건문, 배열이라서 그냥 바로 6장으로 넘어왔다. 왜냐하면 6장부터가 자바의 꽃, 객체지향 프로그래밍을 배우기 때문에..

 

헤드퍼스트자바도 입문서이기 때문에 객체, 클래스, OOP의 개념에 대해서는 깊게 다루지 않았는데 이 책으로 조금 더 깊게 다룰 ㅅ 있는 기회가 되었으면 한다. 약간 처음부터 다시 배우는 느낌으로 개념을 확립하는 것을 목표로 한다.


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

객체지향언어의 기본 개념은 '실제 세계는 객체(사물)로 이루어져 있고, 실제 세계의 모든 사건은 객체 간의 상호작용이다.'라는 것에서 출발한다. 여기서 실제세계의 사물(객체)의 특징과 기능을 분석하고 이를 컴퓨터 프로그래밍에 옮겨놓아 가상세계를 구성하고, 컴퓨터 가상세계에서 일어나는 모든 일(실제 프로그램의 작동)은 객체 간 상호작용으로 처리한다는 것이다.

 

어..

지금에서야 이런 개념이나 설명이 익숙한데 OOP를 처음 배울 때는 도통 이해가 되지 않았다. 물론 지금은 왜 OOP를 이해하지 못했는지 그 때가 이해가 안되긴하지만..

 

하지만 이렇게 개념으로만 봐서는 여전히 추상적이고 어려운게 OOP 이기에, 클래스니 객체니 실제로 개발을 진행하다보면 대충 감은 잡을 수 있을 것이다.


객체와 클래스

흔히 클래스를 '객체의 설계도'라고 한다. 처음 OOP를 배울 땐 이것도 이해가 잘 안됐는데..

 

객체는 '실제로 존재하는 사물'이다. 회원가입 예제를 만든다고할 때의 회원이나 지도 프로그래밍을 만든다고할 때 지도에 저장될 상점들 등을 객체라고 할 수 있다.

 

객체는 속성과 기능을 가진다.

회원가입할 때 회원의 ID, 이름, 연락처 등을 저장하듯이 회원에 대한 속성을 가지고, 회원탈퇴, 회원정보변경 등의 기능도 가진다. 이렇게 객체는 객체마다 속성과 기능을 가지고 있으며, 클래스는 이러한 객체를 정의하는 것이다. 이 객체가 어떤 속성을 가지고 있는지, 어떤 메서드를 가지고 있어 어떤 기능을 수행하는지에 대해 정의한 것이다.

 

그러나 클래스는 객체 정의, 생성 등에서만 활용될 뿐 객체는 아니다.

파이썬은 모든 것이 객체이기 때문에 클래스와 메서드까지 객체로 활용되지만 자바에서는 클래스와 메서드는 객체가 아니다.

class Member {
	Long id;
    String name;
   	Integer phoneNumber
    
    void exitMember() { } //회원탈퇴
    void modifyMember() { } //회원정보수정
}

이런식으로 Member 객체는 속성값으로 id, name, phoneNumber를 가지고 기능으로 exitMember와 modifyMember를 가진다. 그리고 이를 정의한 것이 Member 클래스

 

 

클래스는 객체가 아니기 때문에 실제로 객체를 이용하려면 클래스를 불러와야한다. 생성자를 호출하든 뭐든

이렇게 클래스를 통해 객체를 만드는 과정을 인스턴스화라고하며, 객체를 클래스의 인스턴스라고한다. 위의 Member 객체를 가지고 Member member = new Member(); 로 객체를 만들었다면 Member 객체의 인스턴스가 member 변수에 대입된 것으로, member 변수를 Member 객체의 인스턴스 변수라고 칭한다.

 

Member member;
member = new Member();

이렇게 한 줄짜리 코드를 두 줄로 나눠쓸 수도 있다.

 

Member member; 는 Member 클래스 타입의 참조변수인 member를 선언하며, 이 때는 힙메모리에 member를 저장할 공간만 만들어진다. 아무것도 할 수 없다.

 

이후 Member 클래스의 생성자를 통해 인스턴스가 힙메모리에 만들어진 공간에 Member 클래스의 인스턴스가 생성된다. 생성자에서 별도의 설정을 하지 않았으면 멤버 변수(객체의 속성값)에는 기본값이 들어간다. 그리고 이 때 생성된 객체의 주소가 변수 member에 저장된다. 그래서 변수가 객체의 주소를 참조하고 있기 때문에 참조변수

 

멤버변수나 메서드에는

member.name = "윤마치";
member.modifyMember();

이런식으로 접근할 수 있다. 다만 게터세터를 쓰고나면 멤버변수에 직접적으로 접근할 수는 없긴하지만..

 

이렇게 객체와 객체의 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 호환가능해야한다.

Member member1 = new Member();
Member member2 = new Member();

member1.name = "윤마치";
member2.name = "윤만치";

또한 같은 클래스로부터 생성되었어도 다른 객체를 참조하고 있으면 가지고있는 멤버변수값이 다르다. 회원객체를 100개 생성하였으면 100개 다 다른 객체다. 지금이야 당연한 것이지만 처음에는 이걸 몰라서 은근 헤맸다..

 

member1 = member2

다만 이렇게하면 같은 객체를 참조할 수 있다. member1 인스턴스가 member2 인스턴스를 참조하게되어 두 객체가 동시에 이름이 "윤만치"인 Member 객체를 참조하게된다. member1이 기존에 참조하던 이름이 "윤마치"인 Member 객체는 사용할 수 없어 가비지 컬렉터가 제거하기만을 기다려야한다. 마치야미안해

 

member1.name = "윤마치";

이렇게 같은 객체를 참조 중일 경우 member1에서 이름을 수정해도 자동으로 member2도 이름이 바뀐다. 다만 이렇다고해서 원조 윤마치 객체를 다시 참조하는 것은 아니고 기존 윤만치 객체에서 이름만 바꾸게된다.

 

따라서 객체는..

1. 객체는 '자바 세상에서 프로그래밍을 통해 관리할 주체'이며, 속성과 기능을 가진다. 또 이 속성과 기능을 정의하고 객체를 생성할 수 있게 만들어주는 것이 클래스이며, 클래스는 객체가 아니다.

2. 변수에 객체의 인스턴스를 저장하면 객체가 메모리에 생성되고 그 주소값이 객체에 저장된다. 따라서 같은 타입의 클래스를 통해서 만들어졌더라도 서로 다른 객체들은 서로 다른 속성값을 가질 수 있다. 다만 같은 객체를 참조 중일 경우 한 인스턴스 변수를 통해 속성값을 바꾸면 자동으로 같은 객체를 참조 중인 다른 인스턴스에도 이것이 반영된다.

 

자바에서의 배열 역시 배열에는 객체가 들어가는 것이 아니라 참조값이 들어간다. (단, int나 char 같은 기본형변수를 저장하면 그 값이 그대로 들어간다.)

참조값의 집합을 묶어서 하나의 참조변수에 저장한 것이 배열. 그래서 배열을 형성하기만하면 배열에 null값만 들어가서 배열의 각 요소마다 하나하나 객체를 생성해주어야했다.

 

따라서 이러한 특성들을 통해서 얻는 OOP의 가장 큰 장점은 '코드 재사용성이 높고 변경에 유리하다'이다. 왜 그런가 싶지만.. Member를 저장할 때 나는 클래스를 불러와 객체를 만든 다음에 객체의 이름도 정하고 연락처도 정하고해서 객체를 꾸미고 나면 그 객체를 불러오기만하면 다시 정보를 수정하던가 아니면 DB에 저장하던가 역할을 수행할 수 있다.

 

하지만 '객체'라는 개념이 존재하지 않는 절차지향 프로그래밍에서는

귀찮아서 GPT에게 물어봄

이렇게 배열 등을 써서 값을 저장한 다음에 DB에 접근해야한다. 얼마나 불편해!

 

또 나중에 디자인패턴을 잘 이해하고나면 이런 수정이 용이하다는 특징이 극대화된 방향을 경험해볼 수 있을 것이다. 단적인 예시로 팩토리 패턴이라던지..

 

다만 디자인패턴 등을 포함해서 완전 객체지향적으로 프로그래밍을 하기 위해서는 거시적 관점에서 설계할 수 있는 능력이 요구되기 때문에, 이 장점들을 십분 활용하기란 쉬운 일이 아니다.라고한다. 맞는 말 같기도하다..

 

우선은 객체지향의 개념에 대해서 알아봤고, 바로 다음으로 클래스와 메서드에 대해 알아보려고한다.

'언어공부 > Java | Kotlin' 카테고리의 다른 글

[CS] 자바의 정석 독서 #7 - 메서드 오버로딩  (0) 2025.10.01
[CS] 자바의 정석 독서 #6 - 클래스와 메서드  (0) 2025.09.24
[CS] 자바의 정석 독서 #5 - 연산자  (0) 2025.09.22
[CS] 자바의 정석 독서 #4 - 형변환  (0) 2025.09.21
[CS] 자바의 정석 독서 #3 - float, double, 부동소수점, 그리고 오차  (0) 2025.09.20
'언어공부/Java | Kotlin' 카테고리의 다른 글
  • [CS] 자바의 정석 독서 #7 - 메서드 오버로딩
  • [CS] 자바의 정석 독서 #6 - 클래스와 메서드
  • [CS] 자바의 정석 독서 #5 - 연산자
  • [CS] 자바의 정석 독서 #4 - 형변환
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[CS] 자바의 정석 독서 #6 - 객체지향 프로그래밍, OOP란 무엇인가?
상단으로

티스토리툴바