클래스(class)란?
객체(object)를 만들 때 필요한 청사진(설계도)이다.
객체(object)란?
실제로 존재하는 것
- 컴퓨터, 계산기, 자동차 등 과 같은 사물들이 객체
- 어떤 개념이나 논리 또한 객체(ex.덧셈 뺄셈 등)
클래스 구조
class 클래스 {
// 1. 속성
// 2. 생성자
// 3. 기능
}
속성
- 객체의 데이터(상태) 를 저장하는 변수
- 예: String name;, int age;
생성자
- 객체가 생성될 때 초기화 하는 역할
- 클래스 이름과 동일한 메서드이며, 반환 타입이 없음
기능
- 객체의 동작(행위) 를 정의하는 함수
클래스 = 속성(데이터) + 생성자(초기화) + 기능(동작)
게터(getter) : 클래스의 속성을 가져올 때 사용되는 기능을 의미
세터(setter): 객체의 속성을 외부에서 설정할 수 있게 해주는 기능
JVM 메모리 구조

- Method Area(도서관 비유)
- 프로그램 시작 시 정보가 저장됩니다.
- 클래스 정보(.class 파일) 가 올라가는 곳.
- 클래스의 메서드 정보, static 변수 등이 저장됩니다.
- 모든 객체가 공유하는 공용 공간
- Stack Area(접시 쌓기 비유)
- 가장 위에 있는 접시를 먼저 꺼내듯 비슷한 구조로 생각하시면 됩니다.
- 선입후출(LIFO) 구조 입니다. 먼저 들어온 것이 가장 늦게 나간다는 뜻입니다.
- 메서드가 호출될 때마다 새로운 접시한장(스택프레임)이 쌓입니다.
- 가장 위의 접시(최근 호출된 메서드)가 먼저 실행됩니다.
- 메서드 실행이 끝나면 스택에서 제거됩니다.
- Heap Area(풍선 비유)
- new 키워드로 생성된 객체가 저장되는 곳입니다.
- 객체의 실제 데이터가 저장되고 데이터의 주소는 stack 영역에 저장됩니다
래퍼클래스(Wrapper Class)란?
기본 자료형을 객체로 감싸는 클래스
| 기본 자료형 | 래퍼 클래스 |
| byte | Byte |
| short | Short |
| int | Int |
| long | Long |
| float | Float |
| double | Double |
| char | Char |
| boolean | Boolean |
래퍼 클래스를 사용하는 이
- 기본형은 객체처럼 속성, 기능을 가질 수 없습니다.
- 하지만 객체는 기능을 제공할 수 있습니다.
- 기본형을 감싼 객체를 만들어 기능을 제공하면 편리하게 데이터처리를 할 수 있습니다.
Integer num = 123; // 래퍼클래스
String str = num.toString(); // 편리한 기능
int a = 100; // 그냥 데이터 100
String str = a.toString(); // 변환 불가
Static이란?
- static 키워드는 모든 객체가 함께 사용하는 변수나 메서드를 만들 때 사용
- 객체를 만들지 않아도 클래스 이름만으로 바로 사용 가능
- 모든 객체가 같으 값을 공유
- static변수와 메서드는 한 번만 생성되고 메서드영역에 저장
class Person {
// static 변수
static int population = 0;
// static 메서드
static void printPopulation() {
System.out.println("현재 인구 수: " + population);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person(); // p1 객체 생성
p1.name = "seokhyeon"; // p1 객체의 데이터에 접근
Person p2 = new Person(); // p2 객체 생성
p2.name = "Jungseokhyeon"; // p2 객체의 데이터에 접근
}
}
인스턴스 메서드란?
- 객체의 속성을 활용하는 메서드
- 객체가 생성된 후에만 사용 가능
class Person {
String name;
void printName() { // 인스턴스 메서드
System.out.println("나의 이름은 " + this.name + "입니다.");
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "seokhyeon";
p1.printName(); // p1 객체의 메서드 실행
Person p2 = new Person();
p2.name = "jungseokhyeon";
p2.printName(); // p2 객체의 메서드 실행
}
}
클래스 멤버란?
- 클래스 변수 + 클래스 메서드
- 클래스 자체에 속하는 변수와 메서드를 의미
- static 키워드를 사용해서 선언합
- 해당 클래스로 만들어진 객체가 공유해서 사용 가능
- 클래스가 로드될때 메서드 영역에 적재
- 객체 생성 없이 사용 가능
| 속성 | 설명 |
| 클래스 변수 |
|
| 클래스 메서드 |
|
Final 란?
- 1. 변수는 변경이 불가능하게 만듭니다.변수에서 final
- 변수에 final 을 붙이면 변수를 한 번만 설정할 수 있습니다.
- 2. 클래스는 상속할 수 없게 만듭니다.클래스에서 final
- final 로 선언된 클래스는 상속할 수 없습니다.
- 3. 메서드는 수정할 수 없게 만듭니다.(오버라이딩 불가)메서드에서 final
- final 로 선언된 메서드는 오버라이딩 할 수 없습니다.
class Parent {
final void show() {
System.out.println("Hello from Parent");
}
}
class Child extends Parent {
@Override
void show() { // final 메서드를 재정의할 수 없음
System.out.println("Hello from Child");
}
}
상수(constant)
- 상수는 변하지 않고 항상 일정한 값을 갖는 수
- Java에서 상수는 대문자로 표현하는 것이 관례
- 프로그램 실행중에 절대 변경되서는 안되기 때문에 static final 키워드를 사용해 선언
불변객체(Immutable Object)
- 불변객체는 내부 상태를 변경할 수 없는 객체
- final 을 속성(property, field) 에 활용
- 세터(setter) 없이 설계
- 변경이 필요할 경우 새로운 객체를 만들어야
- 예) String , Integer , 래퍼클래스 등
인터페이스(interface)란?
- 인터페이스는 설계 표준
- 클래스가 따라야할 최소한의 공통 규칙을 정의하는 역할
- 클래스에서 implements 키워드로 인터페이스를 활용 가능
- 인터페이스를 구현한 클래스를 구현체라고
interface Car {
void drive();
void stop();
}
class LuxuryCar implements Car {
@Override
void drive() { // 인터페이스 규칙 준수
System.out.println("멋지게 이동합니다."); // 구현 내용은 자유롭습니다.
}
@Override
void stop() { // 인터페이스 규칙 준수
System.out.println("멋지게 정지합니다."); // 구현 내용은 자유롭습니다.
}
void charge() { // 🎉 CarA 만의 기능을 확장 가능합니다.
System.out.println("차량을 충전합니다");
}
}
public class Main {
public static void main(String[] args) {
LuxuryCar car1 = new LuxuryCar();
SpeedCar car2 = new SpeedCar();
// 각 차량의 공통 기능
car1.drive();
car1.stop();
car2.drive();
car2.stop();
// 각 차량의 고유 기능
car1.charge();
car2.autoParking();
}
}
| 속성 | 설명 |
| 인터페이스 다중구현 |
|
| 인터페이스 다중상속 |
|
캡슐화 (Encapsulation) 란?
- 객체의 정보를 외부에서 직접 접근하지 못하게 보호하는 개념
- 캡슐처럼 감싸서 내부를 보호하고 외부로부터 내용물을 숨기고 있는 모습에서 유래
- 클래스 혹은 객체의 캡슐화는 접근제어자 를 통해서 구현 가
접근제어자(Access Modifier)
- 접근제어자는 클래스, 변수, 메서드, 생성자의 접근 범위를 제한하는 키워드
- 캡슐화 구현을 위해 사용
| 접근제어자 | 클래스 내부 | 패키지 내부 | 상속한 클래스 | 전체 공 |
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
게터(Getter)와 세터(Setter)
캡슐화가 된 데이터에 접근 방법
- 캡슐화가 잘 적용된 클래스는 내부 데이터를 private 으로 보호하고 있습니다.
- 데이터 조회나 변경이 필요한 경우 안전한 접근방법이 필요합니다.
- 그 역할을 수행하는 메서드가 바로 게터(Getter)와 세터(Setter) 입니다
게터 활용법
public class Person {
private String secret;
public String getSecret() {
return this.secret; // 객체의 secret 속성 반환
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.secret; // 직접 접근 불가능
String newSecret = p1.getSecret(); // 게터를 활용해 접근가능
}
}
세터 활용법
public class Person {
private String secret;
public void setSecret(String secret) {
this.secret = secret; // secret 속성 설정 및 변경
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.secret = "password"; // 직접접근, 변경 불가능
p1.setSecret("newPassword"); // 세터를 활용해 접근, 변경가능
}
}
'JAVA' 카테고리의 다른 글
| 자바 기초 문법 다지기 4 (1) | 2025.02.26 |
|---|---|
| 자바 기초 문법 다지기 3 (1) | 2025.02.26 |
| 자바 기초 문법 다지기3 (0) | 2025.02.26 |
| 자바 기초 문법 다지기 (2) | 2025.02.24 |
| 조건문 (0) | 2025.02.20 |