티스토리 뷰
이 글은 클래스의 구성 멤버와 이를 통해 클래스 설계하는 방법에 대해 알아보려고 한다.
클래스와 객체 그리고 인스턴스
클래스는 객체를 생성하기 위한 설계도이다.
클래스는 객체가 가지는 속성(필드)과 동작(메서드) 그리고 생성자를 정의한다.
객체는 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 객체와 식별 가능한 존재이다.
클래스로부터 만들어진 객체를 인스턴스라고 한다. 클래스로부터 객체를 만드는 과정을 인스턴스화라고 하며 해당 인스턴스는 heap 영역에 할당된다.
인스턴스는 클래스의 구체적인 실체의 객체를 의미하며 객체는 더 넓은 의미로 사용된다.
모든 인스턴스는 객체가 될 수 있지만, 모든 객체는 인스턴스가 아니라고해..
Car car = new Car();
클래스의 구성 멤버
public class Car {
private String brand; (1)
public Car() {} (2)
public String getBrand() { (3)
return brand;
}
}
1) 필드
객체의 속성을 저장하는 곳이다.
필드 선언 시 값을 초기화하거나 생성자를 통해서 초기화할 수 있다.
대부분의 경우 필드는 private 으로 설정하는데, 이는 객체지향 프로그래밍의 특징인 캡슐화와 관련이 있다.
이렇게 설정함으로써 외부 클래스에서 직접 접근하지 않도록 하여 객체 내부 상태를 숨길 수 있다. 필드에 접근하려면 public 접근제어자로 선언된 getter/setter 메서드를 통해서만 가능하도록 한다.
public class Car {
//필드 초기화
private String brand = "hyundai";
}
2) 생성자
new 연산자를 사용하여 객체를 초기화하는 특별한 메서드이다.
오버라이딩을 통해 다양한 초기화 방법을 제공할 수 있으며, 특별한 초기화가 필요없는 경우 기본 생성자를 사용할 수 있다. 필드 초기화 뿐만 아니라 객체를 생성하였을 때 초기화하고 싶은 내용을 작성할 수 있다.
public class Car {
private String brand;
//기본 생성자
public Car() {}
//오버로딩
//필드 초기화
public Car(String brand) {
this.brand = brand;
}
}
3) 메서드
객체의 동작을 나타내는 함수이다.
외부에서 호출할 필요가 없는 메서드는 private 으로 설정하여 클래스 내부에서만 사용되도록 하며, 적절한 접근제어자를 사용하여 메서드의 사용 가능한 범위를 설정하도록 한다.
외부에서 데이터를 받아야 하는 경우 매개변수를 설정한다.
수행 결과가 있을 경우 적절한 타입을 설정하여 반환하고 작업 결과가 없을 경우 void 를 사용하여 반환값이 없음을 명시한다.
수행할 동작에 대해 잘 설명할 수 있도록 명확한 이름으로 설정하며 동사로 시작한다.
public class Car {
private String brand;
// 브랜드 정보를 가져온다.
// public 접근 제어자를 사용함으로써 외부에서 호출할 수 있다.
public String getBrand() {
return brand;
}
// 브랜드 정보를 저장한다.
// 데이터 저장하는 함수로 void 사용하여 반환 값이 없다.
// 외부에서 매개변수를 받고 해당 필드에 매개변수로 받은 데이터를 저장한다.
public void setBrand(String brand) {
this.brand = brand;
}
}
예제를 통해 클래스 설계와 객체 활용
운전면허를 취득하고 운전하는 것을 좋아하니까 간단하게 자동차 클래스를 만들어보았다.
자동차의 데이터는 브랜드, 모델명, 색상, 스피드 그리고 엔진 상태를 갖는다. 자동차의 속도와 엔진의 상태는 자동차 객체를 생성할 때 모두 동일한 값을 유지하기 때문에 필드에 초기값을 설정해주었다.
자동차를 초기화(생성자) 방법은 2가지로 나타냈다.
1. 자동차 객체를 생성할 때 브랜드를 설정하지 않았으면 hyundai 자동차라는 것이라고 설정하였다.
2. 자동차 객체를 생성할 때 브랜드를 설정하면 해당 객체는 해당 브랜드를 가진 자동차가 생성되도록 설정하였다.
자동차 동작(메서드)으로는 엔진의 on/off, 속도의 가속 및 감속을 나타냈다. (자동차의 필드를 읽고 수정하는 메서드를 선언할 수도 있다.)
public class Car {
private String brand;
private String model;
private String color;
private int speed = 0;
private boolean engineOn = false;
public Car(String model, String color) {
this.brand = "hyundai";
this.model = model;
this.color = color;
}
public Car(String brand, String model, String color) {
this.brand = brand;
this.model = model;
this.color = color;
}
public void startEngin() {
if (!engineOn) {
engineOn = true;
}
}
public void stopEngin() {
if (engineOn) {
speed = 0;
engineOn = false;
}
}
public void speedUp(int increment) {
if (engineOn) {
speed += increment;
}
}
public void speedDown(int decrement) {
if (engineOn) {
speed -= decrement;
if (speed < 0) {
speed = 0;
}
}
}
}
public class Main {
public static void main(String[] args) {
Car carnival = new Car("kia", "carnival", "SWP"); (1)
Car tucson = new Car("tucson", "TCM"); (2)
tucson.startEngin(); (3)
tucson.speedUp(10); (4)
tucson.speedDown(10); (5)
tucton.stopEngin(); (6)
}
(1) brand, model, color 를 매개변수로 갖는 생성자를 호출하여 carnival 객체를 생성한다.
(2) model, color 를 매개변수로 갖는 생성자를 호출하여 tucson 객체를 생성한다. 해당 생성자에는 brand 가 hyundai 로 초기화되어있다.
(3) ~ (6) Car 클래스에 정의되어있는 메서드를 실행한다.
필드, 메서드, 생성자는 클래스의 기본 구성 요소이다.
위에서 잠깐 언급한 캡슐화는 OOP 특징 중 하나인데, 그러한 특징들이 실제로 어떻게 코드에서 적용되고 있는지 그리고 설계 원칙에 대해서도 알아보고 직접 적용해보도록 해야겠다.
'Language > Java' 카테고리의 다른 글
final 키워드 (0) | 2024.10.18 |
---|---|
생성자와 오버로딩 (0) | 2024.10.18 |
이넘(Enum) (0) | 2024.10.16 |
배열에서 메모리 접근 (0) | 2024.10.15 |
[Java] Collection Framework (0) | 2022.11.27 |
- Total
- Today
- Yesterday
- 로드 밸런서
- Caching
- HashSet
- 티스토리챌린지
- Load Balancer
- AutoConfiguration
- nginx
- nosql
- HashMap
- Spring
- 인스턴스변수
- syncronized
- JPA
- java
- Red-Black Tree
- Security
- 오블완
- 자동구성
- 인터페이스
- 고정 세션
- object
- Sticky Session
- @conditional
- 다중화
- 추상클래스
- 정적변수
- spring boot
- fail-safe
- fail-fast
- Hash
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |