06 클래스
1. 객체지향 프로그래밍
1
2
3
4
5
6
7
// 객체지향 프로그래밍의 예
public class Car {
String model;
void drive() {
System.out.println(model + "이(가) 달립니다.");
}
}
요약: 객체지향 프로그래밍은 객체를 중심으로 데이터와 동작을 캡슐화하는 프로그래밍 패러다임이다. 실세계에 있는 사물을 모티브로 함 집합 관계 -> 완성품과 부품의 관계 사용 관계 -> 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계 상속 관계 -> 부모와 자식 관계. 필드. 메소드를 물려받음
캡슐화, 상속등이 있음
캡슐화 -> 데이터, 동작을 하나로 묶고 실제 구현 내용을 외부로 감춤 상속 -> 자기 플드와 메소드를 자식에게 물려줌 다형성 polymorphism
2. 객체와 클래스
1
2
3
4
5
6
public class Dog {
String name;
void bark() {
System.out.println(name + ": 멍멍!");
}
}
객체를 생성하려면 설계도에 해당하는 클래스가 필요 생성된 객체 -> 인스턴스 과정 -> 인스턴스화 여러 개의 인스턴스를 만들 수 있음
요약: 클래스는 객체의 설계도이며, 객체는 클래스의 인스턴스다.
3. 클래스 선언
1
2
3
4
public class Student {
String name;
int grade;
}
요약: 클래스는 class 키워드로 선언하며, 객체의 속성과 동작을 정의한다.
4. 객체 생성과 클래스 변수
1
2
Student s = new Student();
s.name = "철수";
요약: 객체는 new 키워드로 생성하며, 클래스 변수는 객체의 속성을 나타낸다.
5. 클래스의 구성 멤버
1
2
3
4
5
public class Book {
String title; // 필드
Book(String t) { title = t; } // 생성자
void read() { System.out.println("Reading " + title); } // 메소드
}
요약: 클래스는 필드, 생성자, 메소드로 구성된다.
필드 -> 객체의 데이터를 저장 생성자 -> 초기화 역할, 리턴 타입 없고 이름은 클래스 이름과 동일 메소드 -> 함수
6. 필드 선언과 사용
1
2
3
4
public class Laptop {
String brand;
void setBrand(String b) { brand = b; }
}
요약: 필드는 객체의 데이터를 저장하며, 메소드를 통해 접근한다.
7. 생성자 선언과 호출
1
2
3
4
5
public class Person {
String name;
Person(String n) { name = n; }
}
Person p = new Person("영희");
요약: 생성자는 객체 초기화를 위해 호출되는 특수 메소드다.
8. 메소드 선언과 호출
1
2
3
4
5
public class Calculator {
int add(int a, int b) { return a + b; }
}
Calculator calc = new Calculator();
int sum = calc.add(2, 3);
메소드 오버로딩이란 메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소드를 여러 개 선언하는 것. 요약: 메소드는 객체의 동작을 정의하며, 호출을 통해 실행된다.
9. 인스턴스 멤버
1
2
3
4
public class Bike {
String color;
void ride() { System.out.println(color + " 자전거를 탄다"); }
}
요약: 인스턴스 멤버는 객체에 속하며, 객체 생성 후 사용된다.
10. 정적 멤버
1
2
3
4
public class Counter {
static int count = 0;
Counter() { count++; }
}
스태틱 사용해서 인스턴스 안 만들고도 쓸수 있음 메모리로 로딩될 때 자동으로 실행 여러개 선언되어 있을 경우에는 선언된 순서대로 실행 정적 필드는 생성 없이도 사용가능하여 생성자에서 초기화 작업을 안함
요약: 정적 멤버는 클래스에 속하며, 객체 없이 사용 가능하다.
11. final 필드와 상수
1
2
3
4
public class Circle {
final double PI = 3.14;
double radius;
}
상수 선언하면 프로그램 실행 도중에 수정 못함 요약: final 필드는 변경 불가하며, 상수는 고정된 값을 가진다.
12. 패키지
1
2
3
4
package com.example;
public class User {
String id;
}
모두 소문자로 작성하라고 함 요약: 패키지는 클래스를 계층적으로 조직화하여 이름 충돌을 방지한다.
13. 접근 제한자
1
2
3
4
public class Account {
private int balance;
public void deposit(int amount) { balance += amount; }
}
public -> 모두가 접근 가능 protected -> 같은 패키지이거나 자식 객체만 사용 가능 default -> 같은 패키지 내에 모두 가 사용 가능 private -> 객체 내부에서 사용 가능
요약: 접근 제한자는 클래스 멤버의 접근 범위를 제어한다.
14. Getter와 Setter
1
2
3
4
5
public class Product {
private String name;
public String getName() { return name; }
public void setName(String n) { name = n; }
}
외부에서 직접 접근하느 경우 잘못된 데이터 입력 가능 Setter 통해서 유효한 값만 필드에 저장 가능 요약: Getter와 Setter는 private 필드의 안전한 접근을 제공한다.
15. 싱글톤 패턴
1
2
3
4
5
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return instance; }
}
private 접근 제한하여 외부에서 new 연산자로 생성자를 호출 할 수 없음 다만 싱글톤 패턴이 제공하는 정적 메소드를 통해 간접적인 객체 얻기 가능 요약: 싱글톤 패턴은 클래스의 단일 인스턴스만 생성하도록 보장한다.