[Java] 자바 - 클래스
- -
자바 - 클래스
자바(Java)에서 객체(Object)는 클래스(Class)의 인스턴스(Instance)이다. 객체는 데이터와 그 데이터를 처리하는 메서드(Method)의 조합으로 이루어져 있다. 자바는 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 언어로, 객체 지향 프로그래밍은 현실 세계의 개념을 모델링하고 문제를 해결하기 위해 객체를 사용한다.
현실 세계의 개념을 소프트웨어 객체로 추상화하여 설계하는 프로세스를 객체 모델링(Object Modeling)이라고 한다. 이는 객체 지향 프로그래밍의 기반이다. 또한, 객체 모델링은 현실 세계의 복잡한 시스템을 이해하고 문제를 해결하기 위해 객체, 클래스, 그리고 이들 간의 관계를 정의하는 과정을 포함한다.
객체 모델링은 소프트웨어 개발에서 요구사항을 명확하게 이해하고 시스템을 설계하기 위한 중요한 단계 중 하나이다. 객체 모델링을 통해 개발자들은 시스템의 복잡성을 줄이고 유지보수성과 재사용성을 향상할 수 있다. 이러한 모델링은 주로 UML(Unified Modeling Language)과 같은 다이어그램을 사용하여 시각적으로 표현된다.
객체의 상호작용
객체 지향 프로그래밍과 객체 모델링의 아이디어는 현실 세계에서 일어나는 모든 현상을 객체와 객체 간의 상호작용으로 모델링하는 것이다. 다양한 현상을 객체 지향적으로 접근하면 문제를 더 쉽게 이해하고 해결할 수 있다.
객체들은 서로 독립적으로 존재하고, 다른 객체와 상호작용하면서 동작하게 된다. 위의 예제 이미지에서 확인할 수 있듯이 "사람"이라는 객체는 "계산기"라는 객체를 사용하여 연산을 수행한다. 이때 "사용"은 객체의 메서드를 호출하는 것이고 그 사용을 당하는 객체는 결과를 사용하는 객체에게 반환하게 된다.
메서드를 호출하는 것을 자바 코드로 구현한다면 아래와 같이 구현할 수 있다.
변수 = 계산기객체.메서드(파라미터1, 파라미터2, ...);
- 계산기객체. 메서드 - 객체에 도트(.) 연산자를 이용해서 위와 같이 해당 객체에 존재하는 메서드에 접근하여 호출할 수 있다. 도트(.) 연산자로 메서드뿐만 아니라 객체의 필드(속성)에도 접근이 가능하다.
- 메서드(파라미터 1, 파라미터 2,...) - 메서드를 호출할 때 해당 메서드 내부의 로직이 수행됨에 있어 필요한 데이터를 넘겨줄 수 있다. 예를 들어 계산기 객체에 "더하기"라는 메서드가 있을 때 어떤 값을 더할지를 알려줘야 하기 때문에 더할 값을 계산기객체. 더하기(1,2)와 같이 파라미터로 넘겨주는 것이다. 파라미터는 정의하는 메서드에 따라 넘겨줘도, 혹은 넘겨주지 않아도 되는 선택사항이다.
int sum = Calculator.add(1,2);
객체 간의 관계
객체는 개별적으로 생성되어 사용될 수 있지만 대부분의 경우 여러 객체가 서로 상호작용하며 관계를 맺는다. 객체 간의 상호작용은 주로 메서드 호출을 통해 이루어지며, 이것이 객체 지향 프로그래밍의 핵심이다. 다양한 객체들이 서로 연결되어 협력하면 더 복잡한 시스템을 구출할 수 있다. 이것이 객체 지향 프로그래밍의 중요한 특징 중 하나인 "객체 간의 협력"이다.
- 집합 관계 - 한 객체가 다른 객체를 포함하고 있는 관계를 나타낸다. 포함된 객체는 전체 객체의 일부이며, 전체 객체가 소멸되면 포함된 객체도 함께 소멸된다. 위의 예제 이미지에서처럼 자동차는 하나의 완성품이고 그 하위로 엔진, 타이어, 핸들 객체들로 구성된다. 만약, 자동차가 사라지면 그 자동차에 포함되는 부품도 사라지는 것과 같다.
- 사용 관계 - 한 객체가 다른 객체를 사용하거나 참조하는 관계를 나타낸다. 사용 관계에서는 전체 객체가 소멸되어도 참조된 객체는 독립적으로 존재할 수 있다. 사람이 자동차 객체의 메서드(달리다, 멈추다 등)를 호출해서 사용할 수 있고 자동차 객체가 사라진다고 해서 사람 객체가 사라지는 것은 아니다.
- 상속 관계 - 한 클래스가 다른 클래스의 특성(속성과 메서드)을 상속받은 관계를 나타낸다. 상속은 코드의 재사용성을 증가시키고 클래스 간의 계층 구조를 형성한다. 부모와 자식 간의 관계라고 생각하면 된다, 자동차는 기계의 한 종류이기 때문에 기계(상위)와 자동차(하위)는 상속 관계에 있다고 볼 수 있다.
객체와 클래스
클래스는 데이터와 기능(메서드)을 결합한 사용자 정의 데이터 타입이다, 현실 세계에서 비유를 한다면 클래스는 붕어빵을 만들기 위한 틀과 같다. 붕어빵 틀에는 붕어빵을 만들기 위한 형태(모양)와 기능(붕어빵을 굽고, 속을 채우는 등)이 정의되어 있다.
객체(Object) 및 인스턴스(Instance)는 클래스의 인스턴스로, 실제로 메모리에 할당된 데이터이다. 클래스(붕어빵 틀)를 이용해 만들어진 실제 붕어빵이다. 붕어빵 틀을 기반으로 구체적인 모양과 내용이 결정되어 있다.
정리하자면 클래스 = 설계도, 객체 및 인스턴스 = 설계도로 찍어낸 실제 제품으로 생각하면 된다.
객체 지향 프로그래밍 개발은 아래와 같은 단계에 따른다.
- 클래스를 설계한다. = 자동차 설계도를 그린다.
- 설계된 클래스를 가지고 사용할 객체를 생성한다. = 실제 자동차를 공장에서 찍어낸다.
- 생성된 객체를 이용한다. = 완성된 자동차를 탄다.
클래스 선언
이제 실제로 자바 코드로 설계한 클래스를 작성할 것이다. 그러기 전에 자바에서는 식별자 작성 규칙을 따라야 한다. 식별자 규칙은 변수, 메서드, 클래스 등의 이름을 지을 때 사용되는 것으로 다음과 같은 규칙이 있다.
- 문자 - 알파벳(대소문자 구분), 언더스코어(_), 달러 기호($)를 사용할 수 있다.
- 숫자 - 숫자는 식별자의 첫 글자로 사용할 수 없다.
- 예약어 - 자바 예약어(예 : int, class, if 등)는 식별자로 사용할 수 없다.
- 길이 제한 - 식별자의 길이는 제한이 없지만, 적절한 길이로 명명하는 것이 권장된다.
- 의미 있는 이름 - 식별자는 해당 요소의 기능이나 역할을 잘 나타내는 이름이어야 한다.
변수, 메서드, 클래스 등의 이름을 지을 때 한국어나 영어로 해도 크게 문제는 되지 않는다, 하지만 일반적으로 한국어로 하는 경우는 거의 없고 영어로 이름을 짓는다. 또한 클래스 같은 경우 첫 글자는 대문자로 하고 메서드의 경우 소문자로 하는 게 통상적인 규칙이다.
📢 public 키워드가 붙는 클래스는 클래스이름. java 파일에서 파일 이름과 동일해야만 키워드를 추가가능
클래스이름. java
public class 클래스이름{
}
자바에서 기본적인 클래스 선언은 위와 같이 할 수 있으며 이때 public 키워드는 접근 제어자라는 것인데 지금은 단순히 public으로 되어있으면 외부에서 모두 접근이 가능한 클래스로 선언하는 것이라고 이해하면 된다. 클래스 이름 뒤에는 반드시 중괄호 {}를 붙여주는데, 시작 중괄호 {는 클래스의 시작을, 끝 중괄호 }는 클래스 선언의 끝을 의미한다.
Car.java
public class Car{
}
class Tire{
}
일반적으로 소스 파일당 1개의 클래스를 선언하지만 위와 같이 2개 이상의 클래스 선언도 가능하다. Tire 클래스는 파일이름과 동일하지 않기 때문에 public 키워드를 붙일 수 없다. 2개 이상의 클래스가 선언된 소스 파일을 컴파일하면 바이트 코드 파일(. class)은 클래스를 선언한 개수만 큼 생성된다. 결국 소스 파일은 클래스 선언을 담고 있는 저장 단위일 뿐, 클래스 자체는 아니다.
객체 생성과 클래스 변수
클래스를 선언하고 컴파일하게 되면 객체를 생성할 설계도가 완성된 것이다. 그럼 이 설계도를 바탕으로 실제 물건(객체)을 찍어내는 방법은 new 연산자를 사용하는 것이다.
new 클래스이름();
new는 클래스로부터 객체를 생성하는 연산자이다. new 연산자로 생성된 객체는 메모리 힙(Heap) 영역에 생성된다.
현실 세계에서 물건의 위치를 모르면 사용할 수 없듯이 객체 지향 프로그램에서도 물건의 위치 = 객체의 메모리 주소를 알아야 한다. 그래서 new 연산자는 객체를 생성 후 힙 메모리 주소의 위치를 반환한다.
변수 = new 클래스이름();
따라서 위와 같이 선언할 경우 new 연산자로 선언한 객체의 힙 메모리 주소가 변수에 할당되게 된다.
클래스의 구성 멤버
public class Person {
// 멤버 변수 (속성)
String name;
int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 메서드 (동작)
public void introduce() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
// 다른 메서드들...
}
위의 코드에서 Person 클래스는 name과 age라는 멤버 변수(필드)를 가지고 있으며, introduce()라는 메서드를 가지고 있다. introduce() 메서드는 해당 객체의 정보를 출력하는 역할을 한다.
필드
필드는 클래스의 멤버 변수로, 클래스에서 사용되는 데이터를 나타낸다. 다른 프로그래밍 언어에서는 멤버 변수 또는 속성으로 불린다. 또한, 필드는 클래스 내부에서 선언되며, 다양한 데이터 타입으로 선언될 수 있다.
생성자
생성자는 객체가 생성될 때 호출되는 특별한 메서드로, 객체의 초기화를 담당한다. 클래스 이름과 동일하게 정의되며, 반환타입이 없다. 그리고 생성자는 객체의 초기 상태를 설정하거나 필요한 자원을 할당하기 위해 사용된다.
메서드
메서드는 클래스 내부에 정의된 함수로, 클래스의 동작을 나타낸다. 객체의 상태를 변경하거나 특정 작업을 수행하는 데 사용된다. 클래스 내부에서 선언되며, 반환 타입, 메서드 이름, 매개변수 등이 정의된다.
이제 Person 클래스를 사용하여 객체를 생성하고 메서드를 호출하는 예제를 한 번 살펴보자.
public class Main {
public static void main(String[] args) {
// Person 클래스로부터 객체 생성
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
// 객체의 메서드 호출
person1.introduce();
person2.introduce();
}
}
Person 클래스로부터 person1과 person2라는 두 개의 객체를 생성하고, introduce() 메서드를 호출하여 객체의 정보를 출력하고 있다. 두 객체는 서로 다른 힙 메모리 영역에서 각기 다른 주소를 가지고 있다는 점을 명심하자.
'Programming Language > Java' 카테고리의 다른 글
[Java] 자바 - 인스턴스 맴버와 정적 맴버 (1) | 2023.12.26 |
---|---|
[Java] 자바 - 상속 (0) | 2023.12.23 |
[Java] 자바 EOF(End Of File) 처리 (1) | 2023.12.10 |
[Java] 자바 배열(Array) (0) | 2023.11.13 |
[Java] 자바 조건문(if,else if, else, switch) (0) | 2023.10.13 |
소중한 공감 감사합니다