JAVA (1) - OOP

FinDer178·2025년 2월 3일
0

안녕하세요.

아마 개발을 하시다 보면 개인적으로 좋아하는 언어가 생길 것이라고 생각합니다. 다들 좋아하시는 언어가 있으신가요?
저 같은 경우는 학부 시절 수업에서 C++을 주로 많이 사용해서 가장 편하고 익숙한 언어였던 것 같습니다 (처음 포인터 배웠을 때는 엄청 싫어했습니다 ㅎㅎ)

이후에는 주로 웹 백엔드 프로젝트를 수행하면서 JAVA라는 언어가 편해지면서 좋아하게 된 것 같습니다. 아무래도 JAVA가 C++과 비슷한 객체지향 프로그래밍의 성격을 공유하면서도 (클래스, 상속, 다형성 등) 웹과 엔터프라이즈 스케일의 애플리케이션을 주로 개발하는데 사용되기 때문에 그런 것 같다고 생각이 듭니다.

그러면 제가 생각했을 때 중요하다고 생각한 JAVA의 대표적인 특징들을 살펴보고자 합니다. 책이나 블로그, 유튜브에서도 많이 나오는 내용들이지만 제 나름대로 한번 정리하겠습니다. C++을 주로 사용했기에 C++ 기준으로 신기하거나 중요하다고 느꼈던 JAVA의 특징들을 나열하겠습니다.

1. 객체지향 프로그래밍 언어

맞습니다. JAVA는 "객체지향 프로그래밍(OOP, Object Oriented Programming) 언어"입니다. 그러면 객체지향 프로그래밍이란 무엇일까요? 대부분의 컴퓨터 공학도분들이 단순히 객체를 추상적으로 이해하는 경향이 있을 것이라고 생각합니다. 왜냐하면 학부 입학 시 1학년부터 파이썬이나 C++ 같은 객체지향 언어를 먼저 배우면서 객체지향 패러다임을 당연시 여기기 때문입니다.

그러면 객체(Object)란 무엇일까요? 먼저 객체를 본격적으로 설명하기 전에 클래스(Class)에 대해 설명하고자 합니다. 먼저, JAVA나 SPRING을 공부할 때 많이 참고하는 사이트인 Baeldung의 설명을 인용해서 설명하도록 하겠습니다. 본문에는 아래와 같이 클래스에 대해 설명하고 있습니다.

In OOP, classes are blueprints or templates for objects. 
We use them to describe types of entities.

Simply put, a class represent a definition or a type of object. 
In Java, classes can contain fields, constructors, and methods.

객체에 대한 템플릿이니, 객체의 정의 또는 타입을 표현 등등 이래도 이해하기가 힘드실 것이라고 생각합니다. 저 또한 이 클래스라는 개념을 이해하는데 상당한 시간이 걸렸던 것 같습니다. 하지만 학부 JAVA 수업에서 교수님이 클래스란 "사용자가 정의한 타입"이라는 설명을 듣고 정말 명쾌하게 이해가 된 경험이 있습니다.

맞습니다. C++이나 JAVA는 꽤나 타입에 엄격한 언어입니다. 이유를 생각하자면 그 당시 80, 90년대 하드웨어 용량과 성능이 지금보다 상당히 제약되어 있었기에 이러한 타입마다 바이트 수를 달리해 성능을 최대한 끌어올리는 것이 그 당시 최선이었다는게 저의 합리적인 추측이라고 생각합니다. 아무튼 JAVA는 정수, 실수, 문자열 등의 다양한 타입이 존재합니다. 그래서 객체의 속성(state = 필드(field))과 행동(behavior = 메서드(method))을 포함하는 클래스는 타입으로 표현할 수 있습니다. 예시는 다음과 같습니다.

public class Cat {
	// 필드 선언
	String name;
    int age;
    
    // 매개변수 name과 age를 가지는 생성자 선언 
    public Cat(String name, int age) {
    	this.name = name;
        this.age = age;
    }
   
   	// 메서드 선언 
    public void walk() {
    	System.out.println("사뿐사뿐");
    }
}

이렇게 선언한 Cat 클래스를 main문에서 new 명령어를 이용해 Cat 타입의 객체를 생성할 수 있습니다.

public Class Main {
	public static void main(String[] args) {
    	// Cat 타입의 객체 생성
        Cat cat1 = new Cat("깜이", 4);
        Cat cat2 = new Cat("냥이", 5);
        
        // 객체의 메서드 호출
        cat1.walk();
        cat2.walk();
    }
}
        

앞서 설명한 부분을 이어 객체(Object)란 클래스, 즉 내가 정의한 타입으로 만들어낸 실체라고 볼 수 있습니다. 위 코드에서 보이듯이 Cat 클래스를 선언함으로써 Cat 타입의 객체인 cat1, cat2를 생성한 것을 확인할 수 있습니다. 학부 수업 때 교수님이 객체를 설명하시기로는 "클래스를 가지고 실제로 메모리에서 만들어진 것"이라고 하셨는데 해당 설명이 더 잘 와닿는 것 같습니다. 실제로 Baeldung에서도 객체를 다음과 같이 설명하고 있습니다.

While classes are translated during compile time, 
objects are created from classes at runtime.

Objects of a class are called instances, 
and we create and initialize them with constructors:

여기서 객체랑 인스턴스를 헷갈릴 수 있는데 사실상 동의어라고 생각하시면 됩니다.

네, 이렇게 JAVA가 가진 객체지향 프로그래밍의 특징을 간단하게 살펴보았습니다. C++을 주로 코딩 테스트 문제 풀 때 사용했기에 객체지향적인 느낌을 많이 못 느꼈지만 JAVA로 백엔드 개발을 하면서 클래스와 객체에 대해 더욱 자세히 이해할 수 있던 것 같습니다. 인터페이스와 다형성에 대한 글을 이 포스트에 한꺼번에 작성할려고 했는데 분량조절 실패로 다음 포스트에 올리도록 하겠습니다. 그러면 긴 글 읽어주셔서 감사합니다 :)

profile
낙관적 개발자

0개의 댓글

관련 채용 정보