객체지향 프로그래밍 이해하기
객체지향 프로그래밍이란 소프트웨어에 필요한 부품들을 만들고 하나씩 조립해 완성된 프로그램을 만들수 있는 기법이다.
우선 객체에 대해 좀 더 공부해보자. 객체는 영어로 Object, 말 그래도 물체이다. 그리고 이 객체는 속성과 행위를 포함하고 있다. 사람을 예로 들자면 키, 몸무게, 학력, 시력 등은 속성이고 공부하다, 운동하다, 놀다 등은 행위에 속한다. 이처럼 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것을 '객체 모델링' 이라고 한다.
객체지향 프로그래밍의 특징
- 캡슐화 : 속선(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것을 의미한다.(정보은닉)
- 상속 : 부모 객체가 갖고 있는 필드와 메서드를 자식 객체에 물려주어 자식 객체가 이를 활용할 수 있다.
- 다형성 : 객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러 가지 형태로 재구성 되는 것을 의미한다.
- 추상화 : 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것이다.
※ 객체와 클래스 ※
객체를 생성하기 위해 설계도가 필요한데 이러한 설계도를 클래스라고 한다. 개발을 하다보면 누구는 객체라 하고 누구는 인스턴스라 한다. 객체와 인스턴스는 별차이는 없다. 허나 인스턴스의 경우 관계에 좀 더 초점을 둔다. 인스턴스는 클래스를 토대로 생성된 객체를 의미한다. 예를 들면 아이라는 객체가 있다. 아이 객체를 '누구 부모의 아이'로 관계성을 띄게 되면 인스턴스라고 칭할 수 있다. 객체가 인스턴스보다 조금 더 포괄적인 개념이라 생각할 수 있다.
클래스 설계
클래스의 구성 멤버는 필드, 생성자, 메서드가 있다.
클래스를 만들기 위한 4가지 step
1. 클래스 선언
2. 객체가 가지고 있어야 할 필드 정의
3. 객체를 생성하는 방식을 정의(생성자)
4. 객체가 가지고 있어야 할 메서드 정의
객체 생성
Java에서 객체를 생성하는 방법은 주로 'new' 키워드를 사용한다.
클래스명 객체명 = new 클래스명();
여기서 'new 클래스명()'은 클래스의 생성자를 호출하여 메모리에 새로운 객체를 할당한다. 생성된 객체는 클래스의 속성과 메서드를 사용할 수 있게 된다.
필드와 메서드
<필드>
필드는 클래스의 속성이나 상태를 나타내는 변수다. 각 객체가 고유의 값을 가질 수 있도록 클래스 내부에 정의된다. 필드는 클래스 안에 선언되며, 객체가 생성될 때 초기화 된다.
<메서드>
메서드는 클래스가 수행할 수 있는 동작이나 기능을 정의하는 코드 블록이다. 메서드는 객체의 상태를 변경하거나 특정 작업을 수행하는 데 사용된다.
public class Car {
String color;
int speed;
void accelerate() { // 속도를 증가시키는 메서드
speed += 10;
}
void brake() { // 속도를 줄이는 메서드
speed -= 10;
}
}
인스턴스 멤버와 클래스 멤버
<인스턴스 멤버>
인스턴스 멤버는 객체(인스턴스)마다 별도로 존재하는 필드와 메서드를 말다. 각 객체는 고유의 인스턴스 멤버를 가지고 있어, 서로 다른 객체의 인스턴스 멤버는 독립적으로 값을 가질 수 있다.
Car car1 = new Car();
Car car2 = new Car();
car1.color = "Red";
car2.color = "Blue";
car1과 car2 는 서로 다른 color를 가질 수 있다.
<클래스 멤버>
클래스는 모든 객체가 공유하는 필드와 메서드를 말한다. 클래스 멤버는 static 키워드를 사용하여 정의된다. 클래스 멤버는 클래스 자체에 속하므로, 객체를 생성하지 않고도 클래스 이름을 통해 접근할 수 있다. 클래스 필드는 모든 인스턴스에서 공유되기 때문에, 한 객체가 값을 변경하면 다른 객체에서도 그 변경 사항을 반영한다.
public class Car {
String color; // 인스턴스 필드
int speed; // 인스턴스 필드
static int totalCars = 0; // 클래스 필드
public Car() {
totalCars++; // 생성될 때마다 클래스 필드 증가
}
static void displayTotalCars() { // 클래스 메서드
System.out.println("Total cars: " + totalCars);
}
}
여기서 totalCars는 모든 Car 객체가 공유하는 클래스 필드다. displayTotalCars 메서드는 클래스 메서드로, 객체를 생성하지 않고 Car.displayTotalCars()로 호출할 수 있다.
Car car1 = new Car();
Car car2 = new Car();
Car.displayTotalCars(); // "Total cars: 2" 출력
이처럼 인스턴스 멤버는 각각의 객체에 독립적으로 존재하는 반면, 클래스 멤버는 모든 객체가 공유다.
지역변수 및 상수
지역변수 : 메서드나 블록 내에서 선언되고, 해당 블록을 벗어나면 사라지는 변수
상수 : final 키워드 선언되어 값을 변경할 수 없는 변수. 클래스 상수로 선언되어 모든 인스턴스에서 공유되거나, 로컬 상수로 선언되어 특정 메서드나 블록에서만 사용될 수 있음.
생성자 this
생성자(Constructor)는 클래스의 인스턴스가 생성될 때 호출되는 특별한 메서드로, 객체의 초기화를 담당한다. this 키워드는 생성자 내에서 다양한 방식으로 사용되며, 주로 객체 자체를 참조하거나 다른 생성자를 호출하는 데 사용된다.
this 키워드는 생성자 또는 메서드 내에서 현재 객체 자신을 참조한다. 주로 인스턴스 변수와 생성자 매개변수(혹은 메서드 매개변수)를 구분하기 위해 사용된다.
public class Car {
String color;
int speed;
public Car(String color, int speed) {
this.color = color; // 매개변수 color를 인스턴스 변수 color에 할당
this.speed = speed; // 매개변수 speed를 인스턴스 변수 speed에 할당
}
}
접근제어자
public : 모든 곳에서 접근 가능
private : 해당 클래스 내에서만 접근 가능
protected : 같은 패키지 또는 하위 클래스에서 접근 가능
default : 같은 패키지 내에서만 접근 가
상속
상속(inheritance)은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 새로운 클래스가 기존 클래스의 속성과 메서드를 물려받아 재사용하고 확장하는 기능을 의미한다. 상속을 통해 코드의 재사용성을 높이고, 계층적인 클래스 구조를 설계할 수 있다. 부모 클래스(superclass)는 상속은 하는 클래스 자식 클래스(subclass)는 상속을 받는 클래스다.
상속은 extends 키워드를 통해 구현된다.
public class Vehicle { // 부모 클래스
String brand;
int speed;
public void start() {
System.out.println("Vehicle is starting");
}
}
public class Car extends Vehicle { // 자식 클래스
int numberOfDoors;
public void honk() {
System.out.println("Car is honking");
}
}
overriding과 super
메서드 오버라이딩(method overriding)은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 기능이다. 자식 클래스는 부모 클래스의 메서드를 그대로 사용할 수도 있지만, 필요에 따라 동일한 이름과 매개변수로 메서드를 다시 정의하여 새로운 동작을 구현할 수 있다.
public class Car extends Vehicle {
@Override
public void start() {
System.out.println("Car is starting with a key");
}
}
super 키워드는 자식 클래스에서 부모 클래스의 멤버(필드, 메서드, 생성자)에 접근할 때 사용된다. 이를 통해 부모 클래스의 메서드나 생성자를 호출할 수 있다.
'항해99 플러스 > 사전스터디' 카테고리의 다른 글
[TDD] Kent Beck - 테스트 주도 개발 (0) | 2025.03.11 |
---|---|
[TDD방법론 사전스터디] 2주차 (2) | 2024.09.03 |
[TDD방법론 사전스터디] 1주차 (4) | 2024.08.26 |
[Java 스터디] 강의 2주차 (0) | 2024.08.21 |
[SpringBoot 사전스터디] 1주차 (0) | 2024.08.19 |