이번 포스트에서는 자바의 특성 중 하나인 객체 지향 프로그래밍에 대해서 다뤄보려고 한다.
나는 자바라는 언어를 18년도에 대학교 수업에서 처음 접했는데, 당시에는 객체와 클래스를 막연하게만 이해했던 것 같다. 그래서 이것이 프로그래밍을 할 때 왜 중요한지, 실제로 어떤 의미를 갖는지를 알지 못해 그해 기말 프로젝트에서 엄청 고생을 했던 기억이 있다.
* 2:2 체스 게임을 구현해야 했는데, 폰, 비숍, 룩, 퀸, 킹 등의 객체 클래스를 생성해서 사용했어야 했다. 그러나 어떻게 클래스를 나누어야 하는지, 클래스에 어떤 속성이 들어가야 하는지 등을 전혀 이해하지 못했다. 머리로 외운 것과 실제 써보는 건 천지 차이더라.
(사실 내 머리로는 1:1 체스 게임도 헷갈렸는데 2:2 체스 게임 룰도 조금 헷갈리긴 했다.)
인터넷에 돌아다니는 소스 코드를 참고하긴 했었는데, 이것도 어느 정도 지식이 깔려 있어야 이해가 되는 거였다. 프로젝트를 열었는데 날 마주한 수많은 클래스 파일들을 보니... 현기증이 났던 기억이 새록새록하다.
당시에 MVC 패턴도 함께 배워서 적용해서 개발을 했어야 했던 걸로 기억하는데, GUI를 담당하는 부분과 메인 로직을 처리하는 부분을 어찌저찌 분리한다고 해도 저 수많은 클래스를 어떻게 써야하고, 어떤 구조로 움직이는 지 등을 제대로 설계하지 못했다. 지금 생각하면 흑역사다.
이후에 삼성청년SW아카데미에서 다시 Java를 배우고, 실제 웹 개발 프로젝트와 알고리즘 문제에서 클래스와 객체를 사용하면서 이 둘에 대해 많이 익숙해진 것 같다.
객체란?
세상에 존재하는 모든 것. 프로그래밍에서 속성과 기능을 가지는 프로그램 단위. 소프트웨어 세계에서 구현할 대상.
객체지향 vs 절차지향
객체지향(OOP, Object-Oriented Programming)
- 객체를 중심으로 프로그램을 설계하는 방식
- 특징
- 데이터(속성)와 해당 데이터를 다루는 함수(메서드)를 하나의 객체로 묶음
- 현실 세계의 사물처럼 객체 단위로 프로그램을 구성
- 코드의 재사용성, 유지보수성, 확장성이 뛰어남
- 대표적인 언어: Java, Python, C++, JavaScript
- 객체지향의 핵심 개념
- 캡슐화: 데이터와 메서드를 하나의 객체로 묶음
- 상속: 기존 클래스(부모)에서 속성과 메서드를 물려받음
- 다형성: 같은 메서드 이름을 사용하되, 동작을 다르게 구현 가능
- 추상화: 복잡한 부분은 감추고, 필요한 기능만 제공
절차지향 프로그래밍(Procedural Programming)
- 절차(순서)를 따라 실행하는 방식
- 특징
- 프로그램을 순차적인 명령어(절차)로 구성
- 데이터를 중심으로 여러 함수가 이를 처리하는 구조
- 실행 흐름이 중요하며, 코드가 위에서 아래로 차례대로 실행됨
- 대표적인 언어: C, Pascal, COBOL
- 절차지향의 핵심 개념
- 함수 중심: 데이터를 직접 다루는 함수들의 조합으로 프로그램을 구성
- 순차적 실행: 위에서 아래로 실행 흐름이 진행됨
- 전역 변수 사용 빈번: 여러 함수가 같은 데이터를 공유함
객체지향 vs 절차지향 차이점
객체지향(OOP) | 절차지향(Procedural) | |
설계 방식 | 객체(데이터 + 메서드) 중심 | 명령어(절차) 중심 |
코드 재사용성 | 상속, 캡슐화로 재사용 용이 | 함수 재사용만 가능 |
유지보수성 | 유지보수, 확장 용이 | 코드가 길어질수록 유지보수 어려움 |
데이터 접근 | 객체 내부에서 캡슐화 | 여러 함수가 직접 접근 |
대표 언어 | Java, Python, C++, JavaScript | C, Pascal, COBOL |
✅ 언제 어떤 방식을 사용해야할까?
- 규모가 크고 유지보수가 중요한 프로젝트 → 객체지향(OOP) 사용 (예: 게임 개발, 웹 애플리케이션, 대규모 시스템)
- 작고 단순한 프로그램 → 절차지향 사용 (예: 간단한 스크립트, 시스템 프로그래밍)
클래스란?
객체를 생성하기 위한 틀로 모든 객체는 클래스로부터 생성된다.
붕어빵 틀은 클래스, 붕어빵 틀로 만든 붕어빵은 객체로 표현할 수 있다. 각 객체는 공통된 속성과 기능(클래스)을 가질 수 있다.
즉, 클래스는 일종의 설계도, 객체는 클래스(설계도)를 기반으로 만들어진 실제 사물(인스턴스)라고 보면 된다.
필요없어진 객체는 일정 시간이 지난 후 GC가 회수한다.
클래스 vs 객체
클래스(class) | 객체(Object, 인스턴스) | |
정의 | 설계도(틀) | 클래스를 기반으로 만들어진 실체 |
역할 | 객체를 만들기 위한 틀 | 실제 동작하는 개체 |
클래스 구성 요소
클래스는 속성(멤버 변수)와 기능(메서드)로 구성된다.
속성
클래스 내부에서 객체가 가지는 데이터(변수)
기능(메서드)
클래스 내부에서 정의된 함수, 객체의 동작(기능)을 담당
클래스를 사용하면 처음부터 끝까지 만드는 것이 아니라, 작은 부품들을 만들어 그들의 조합으로 하나의 프로그램을 만들 수 있다.
객체 특징
자료형이 같아도 다른 객체
같은 클래스로 만들어졌어도 다른 공간에 존재하는 객체는 다른 객체이다.
ObjectClass obj1 = new ObjectClass();
ObjectClass obj2 = new ObjectClass();
ObjectClass obj3 = new ObjectClass();
if(obj1 == obj2){
System.out.println("obj1 == obj2");
} else {
System.out.println("obj1 != obj2");
}
if(obj2 == obj3){
System.out.println("obj2 == obj3");
} else {
System.out.println("obj2 != obj3");
}
if(obj1 == obj3){
System.out.println("obj1 == obj3");
} else {
System.out.println("obj1 != obj3");
}
obj1 != obj2
obj2 != obj3
obj1 != obj3
obj1, obj2, obj3는 전부 ObjectClass 타입의 객체지만 각자 다른 주소 공간에 존재한다.
null과 NullPointException
레퍼런스에 null이 저장되면 객체의 연결이 끊기며, 더 이상 객체를 이용할 수 없다.
obj1 = null;
System.out.println(obj);
Exception in thread "main" java.lang.NullPointException
obj1이 null로 초기화 되어 아무런 객체 정보를 담지 못한다. 따라서 해당 객체에 접근하려고 하면 NullPointException 에러가 발생한다.
'프로그래밍 언어 > 자바(Java)' 카테고리의 다른 글
Java 프로그래밍 05 : Garbage Collection(GC) (0) | 2025.04.06 |
---|---|
Java 프로그래밍 04 : 생성자와 소멸자 그리고 this 키워드 (0) | 2025.04.05 |
Java 프로그래밍 02 : 프로그램의 실행 구조 (0) | 2025.04.03 |
Java 프로그래밍 01 : Java란? (1) | 2025.04.02 |
Java 프로그래밍 00 (0) | 2025.04.02 |