이번 포스트에서는 객체에 대해 이야기 해보겠습니다.
필자 개인적으로 객체는 이해했다고 생각하면 뭔가 틀리는 경우도 있어서 이번 포스트를 적어보며 정리하는 시간을 가져봅니다.
객체?
자바에서 객체지향은 매우 중요한 개념입니다.
객체 지향 즉, 객체를 만들어서 사용하는것을 지향한다. 인데
여기서 객체를 정리해보면 이렇습니다.
객체(Object)는 클래스(Class)의 인스턴스(Instance)
클래스란, 객체와 행위가 합쳐진 공간입니다. 템플릿을 의미 합니다. 빗대어 표현하면 ‘틀’ 이라고 표현할 수 있습니다.
인스턴스란, 클래스의 속하는 실제하는 객체 즉, 진짜 메모리에 할당 되어있는 객체를 말합니다.
즉, 객체라는 것은 실제하는 메모리에 들어있는 데이터 그리고 함수의 집합입니다.
자바에서는 함수를 메서드 라고 표현합니다.
정리하면
객체 = 데이터 + 메서드
라고 표현해볼 수 있습니다.
붕어빵틀과 붕어빵
필자는 컴퓨터공학관련된 전공을 하여 자바를 배울 수 있는 수업이 있었습니다.
객체와 Class의 관계를 이해하는 것이 자바를 배우는 첫번째 걸음인데
여기서 교수님께서는 이렇게 빗대어 표현하시더군요
Class는 붕어빵틀 , Object는 붕어빵
그때는 Class가 하나의 틀 이니까 객체를 생성하는 의미로 받아들였습니다.
그런데 관련 저서를 읽다 보니 좀 더 구체적인 표현으로는
정확히 Class는 붕어빵 틀이 이 아닌 형상틀 이다.
인상적인 표현이였습니다. 생각해보면 Class는 여러 방식과 종류로
객체를 만들어 낼 수 있고 붕어빵틀과 붕어빵은 클래스와 객체의 개념을 제한한다는 이야기로 받아들여 지기 때문입니다.
물론 교수님께서는 학생들에게 쉽게 이해 시키기 위한 표현 이였지만, Java 개발자로써 목표를 삼고 있는 사람에게는 꽤 생각해 볼 이야기였습니다.
Class는 청사진 , Object는 결과물
이렇게 표현해 보는 것이 더 정확하게 표현할 수 있다고 생각합니다.
객체의 특징
객체의 특징을 보면 이런 이야기를 하고 있습니다.
- 속성과 동작: 객체는 데이터를 나타내는 속성(또는 멤버 변수)과 데이터를 처리하는 동작(또는 메서드)을 가집니다. 예를 들어, 자동차 객체는 속성으로는 색상, 속도, 모델 등을 가지고 있고, 동작으로는 주행, 정차, 가속 등을 수행할 수 있습니다.
- 상태와 행위: 객체는 상태(State)와 행위(Behavior)를 가집니다. 상태는 객체의 속성을 나타내며, 행위는 객체가 수행하는 작업을 나타냅니다. 이를 통해 객체는 자체적으로 데이터를 저장하고 관리하며, 필요한 작업을 수행할 수 있습니다.
- 캡슐화: 객체는 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶어 캡슐화(Encapsulation)됩니다. 이를 통해 객체의 내부 구현을 외부에 숨기고, 객체 간의 상호 작용을 쉽게 관리할 수 있습니다.
- 상속: 객체는 다른 객체로부터 상속을 받아 기능을 확장할 수 있습니다. 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고, 새로운 기능을 추가하여 코드를 확장할 수 있습니다.
- 다형성: 객체는 같은 이름의 메서드를 호출할 때 다양한 동작을 수행할 수 있습니다. 이를 다형성(Polymorphism)이라고 하며, 오버로딩(Overloading)과 오버라이딩(Overriding)을 통해 구현됩니다.
정리하면, 객체는 속성과 동작 그리고 이것을 다루면서 상태와 행위로써 볼 수 있습니다.
객체는 캡슐화하여 데이터를 숨기고 , 동작하며 상속 받고 다형성을 구현할 수 있다. ****
그리고 이것이 바로 객체 지향 (OOP)의 중요 개념으로써 이야기 됩니다.
OOP의 대하여
객체 지향 프로그래밍(Object-Oriented Programming, OOP) 는 아래와 같은 특징을 가집니다.
잘 읽어보면 결국 객체를 잘 만들고, 활용하기 위해 이런 방식으로 지향해라 , 개발해라 라는 의미인 것을 알 수 있습니다.
- 캡슐화 (Encapsulation):
- 캡슐화는 객체의 속성(데이터)과 행위(메서드)를 하나로 묶고, 외부에서의 직접적인 접근을 제한하는 개념입니다.
- 객체의 내부 구현은 외부로부터 숨겨지고, 오직 공개된 인터페이스를 통해서만 접근할 수 있습니다.
- 이를 통해 객체의 내부 구현을 보호하고, 안정성과 유지보수성을 높일 수 있습니다.
- 상속 (Inheritance):
- 상속은 기존 클래스의 속성과 메서드를 재사용하여 새로운 클래스를 정의하는 개념입니다.
- 상속을 통해 코드의 재사용성을 높일 수 있으며, 기존 클래스의 기능을 확장하여 새로운 기능을 추가할 수 있습니다.
- 상속을 통해 코드의 중복을 줄이고, 유지보수성을 높일 수 있습니다.
- 다형성 (Polymorphism):
- 다형성은 같은 이름의 메서드나 연산자를 다양한 방식으로 동작하도록 하는 개념입니다.
- 다형성을 통해 여러 객체를 하나의 타입으로 다룰 수 있으며, 객체의 실제 타입에 따라 다른 동작을 수행할 수 있습니다.
- 다형성은 오버로딩(Overloading)과 오버라이딩(Overriding)을 통해 구현됩니다.
- 추상화 (Abstraction):
- 추상화는 객체에서 공통된 특성을 추출하여 모델링하는 개념입니다.
- 객체 지향 프로그래밍에서는 추상 클래스나 인터페이스를 사용하여 추상화를 구현합니다.
- 추상화를 통해 복잡한 시스템을 단순화하고, 핵심적인 부분에 집중할 수 있습니다.
여기서 캡슐화 ,상속, 다형성은 자바를 통해 개발하다 보면 자주 접할 수 있습니다.
예를 들어 캡슐화는 접근제어자를 통해 이야기 해볼 수 있습니다.
접근제어자? 그게뭔데
Public
public class MyClass {
public int publicVar;
public void publicMethod() {
// 모든 클래스에서 접근 가능합니다.
}
}
protected
public class MyClass {
protected int protectedVar;
protected void protectedMethod() {
// 동일 패키지 내의 클래스와 해당 클래스를
// 상속받은 외부 패키지의 클래스에서 접근 가능합니다.
}
}
private
public class MyClass {
private int privateVar;
private void privateMethod() {
// 해당 클래스 내에서만 접근 가능합니다.
}
}
함수 앞에 적거나 변수 앞에 적어서 Scope를 표현하는 자바의 기술 중 하나입니다.
즉, 캡슐화라는 것은 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶고, 외부에서의 직접적인 접근을 제한하는 것을 의미합니다.
만약 다른 Class에서 private으로 선언한 함수를 부른다면? 찾지 못하고 오류를 낼 것입니다.
이런식으로 접근을 제어해 캡슐화 시켰다는 개념을 이해해 볼 수 있습니다.
상속과 다형성
일단, 상속은 말그대로 받아오는 것 입니다. 코드로 이해하는 것이 훨씬 편한데
// 부모 클래스
class Vehicle {
String brand;
int year;
void honk() {
System.out.println("Tuut, tuut!");
}
}
// 자식 클래스
class Car extends Vehicle {
int wheels;
void describe() {
System.out.println("This car is a " + brand + " manufactured in " + year + " with " + wheels + " wheels.");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.brand = "Toyota";
myCar.year = 2022;
myCar.wheels = 4;
myCar.describe(); // 출력: This car is a Toyota manufactured in 2022 with 4 wheels.
myCar.honk(); // 출력: Tuut, tuut!
}
}
보시는 것처럼 부모 클래스에는 큰틀이 자식 클래스에서는 자세한 데이터를 담아 두고 표현한 다는 것이죠.
사람으로 비유하면? 부모 클래스는 사람 자식 클래스는 양세진, 김연아, 손흥민 등으로 만들어 볼 수 있습니다.
다형성(Polymorphism)은 동일한 이름의 메서드나 연산자가 여러 클래스에서 다양한 방식으로 동작하는 것을 의미합니다.
자바에서 다형성은 오버로딩(Overloading)과 오버라이딩(Overriding)을 통해 구현됩니다.
여기에는 오버로딩은 같은 이름의 메서드가 매개변수의 개수나 타입에 따라 다르게 동작하는 것을 말하며, 오버라이딩은 상위 클래스의 메서드를 하위 클래스에서 재정의하여 다양한 동작을 구현하는 것을 말합니다.
말은 어려운데 쉽게 이해해서 위 상속의 개념에서 여러 클래스로 나누어 다양한 함수 , 변수를 담는다 라는 의미입니다.
// 부모 클래스
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}
// 자식 클래스 1
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
// 자식 클래스 2
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 다형성을 활용하여 Dog 객체를 Animal 타입으로 선언
Animal myCat = new Cat(); // 다형성을 활용하여 Cat 객체를 Animal 타입으로 선언
myDog.makeSound(); // 출력: Bark
myCat.makeSound(); // 출력: Meow
}
}
코드로 보면 훨씬 직관적으로 이해 할 수 있습니다.
추상화? 뭐지?
추상화 (Abstraction)를 만약 개발자가 아닌 사람들에게 물어보면 어떻게 대답할까요?
아마 피카소를 떠올리며 이상하게 생긴 그림? 정도로 생각할 것입니다.
사전에서는 • 미술에서 추상화(抽象畫)는 대상의 구체적인 형상을 나타낸 것이 아니라 점, 선, 면, 색과 같은 순수한 조형 요소로 표현한 미술의 한가지 흐름이다.
그럼 추상이란?
"추상"이라는 용어의 사전적 의미는 "사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것" 이라 정의한다.
라고 이야기합니다. 즉, 어떤 특징을 가져와서 부각 시켜 표현하는 것을 의미합니다.
우리가 알아야하는 추상화도 같은 논리입니다.
설계를 하며 공통된 특징을 찾아 추출해 이것을 인터페이스 혹은 추상 클래스 로써 만든다.
결국 부각시킬 부분을 찾아내 이것을 표현한다 라고 이해 해볼 수 있습니다.
정리하며
오늘은 자바의 객체에 대해 공부하고 이해한 내용을 정리해봤습니다.
특징에 대한 이해를 해보려 노력했는데 제 비유가 잘 이해 되실지 모르겠지만,
다양한 블로그나 유튜브에서도 좋은 정보들이 많기 때문에 참고해보시면 도움이 될 것 같습니다.
'JAVA' 카테고리의 다른 글
JAVA-OverLoding & OverRiding (0) | 2024.05.29 |
---|---|
JAVA-스레드 (0) | 2024.05.28 |
JAVA- 메모리 (0) | 2024.05.28 |
JAVA - 구동과정 (0) | 2024.05.27 |
JAVA - 소개 (0) | 2024.05.27 |