1. 객체와 클래스 : 사용자 정의 자료형의 이해
객체지향 프로그래밍의 가장 큰 특징 중 하나는
사용자가 새로운 자료형을 직접 정의해서 사용할 수 있다는 점이다.
우리는 int, string 같은 자료형을 사용해 데이터를 저장한다.
자바는 이처럼 내가 원하는 구조를 가진 새로운 자료형도 만들 수 있다.
예를 들어 '책'이라는 자료형이 필요하다면 '제목/저자/가격' 과 같은 정보로 묶을 수 있다.
객체(Object)
객체는 서로 다른 타입의 데이터를 하나로 묶은 구조이다.(이질적)
즉, 관련된 데이터를 하나의 단위로 관리하기 위한 개념이다.
클래스(Class)
클래스는 객체를 생성하기 위한 설계도이다.
public class Book{
public String title;
public String author;
public int price;
}
'책' 이라는 새로운 자료형을 정의
객체 생성 과정
1. Book 타입의 변수 b 선언
Book b;

2. 메모리에 실제 Book 객체 생성
new Book();

3. 생성된 객체의 주소를 변수 b에 저장
b = new Book();

이를 합치면 다음과 같이 표현된다.
Book b = new Book();
2. 클래스와 배열의 차이 + 객체 배열
클래스 : 서로 다른 타입의 데이터를 묶어 관리한다.
class Person {
String name;
int age;
}
배열 : 동일한 타입의 데이터를 묶어 관리한다.
int[] a = new int[5]
* 자바는 배열도 객체로 취급된다.
객체 배열 : 사용자가 만든 자료형을 배열로 생성
Book[] books = new Book[3];
books[0]=new Book();
books[1]=new Book();
books[2]=new Book();

3. Method (메서드)
메서드는 객체의 동작(행위)을 정의하는 기능이다.
public int add(int x, int y){
int z = x+y;
return z;
}
메서드 구성요소
1. 접근 제한자 : Public / Private / Protected / default(생략)
* Public으로 선언된 클래스는 반드시 파일이름과 같아야함.
* 같은 파일에 여러 클래스를 작성할 경우, public 제거하고 작성 ( 다른 패키지에 접근 제한됨)
2. 반환 타입 (리턴 타입) : int, String, void 등
* 반환 값이 없는 경우에는 void 사용 (ex. System.out.println)
3. 메서드 이름 (매개 변수=파라미터) : 메서드 실행에 필요한 값을 전달 받는다.
메서드 Overloading
하나의 클래스 안에서 같은 이름의 메서드를 여러 개 정의하는 기법
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
오버로딩 조건
- 메서드 이름이 같아야 함
- 매개변수의 타입 또는 개수가 달라야함.
오버로딩과 바인딩
오버로딩은 컴파일 시점에 호출할 메서드가 결정된다.
이를 '정적 바인딩'이라고 한다.
4. 클래스 구성 요소
클래스는 크게 두 가지 정보로 구성된다.
- 상태 정보 > 멤버 변수
- 행위 정보 > 멤버 메서드
public class Person{
public String name;
public int age;
public void play(){
System.out.println("밥을 먹는다");
}
// 생성자 메서드
public Person(){
// 객체를 생성하는 코드
}
}
5. 생성자 (Constructor)
생성자는 객체를 생성하고 초기화 하는 특별한 메서드이다.
public class Person {
public Person() {
// 객체 초기화 코드
}
}
특징
- 클래스 이름과 동일
- 반환 타입 없음
- 객체 생성 시 자동 호출
- 객체 초기화 용도로 사용
Person p = new Person();
위 코드에서 new Person()이 생성자를 호출한다.
*실제 메모리 할당은 new가 수행, 생성자는 초기화 담당
5. 클래스 종류 (Model)
1. Main Class
프로그램 실행 시작 지점이 되는 클래스
public static void main(String[] args)
2. DTO / VO
데이터를 저장하고 전달하기 위한 객체 = 계층 간 데이터를 전달하기 위한 객체
class BookDTO {
private String title;
private int price;
}
데이터를 하나로 묶어야할 경우 사용 (데이터를 하나로 수집)
DB에 있는 데이터를 가져와 사용해야하는 경우 사용 > 데이터를 하나로 묶어 담을 바구니가 필요
3. DAO
데이터베이스 접근 로직을 담당하는 객체
데이터 저장, 조회, 수정, 삭제 기능 수행 (CRUD)
4. Utility Class
공통 기능을 제공하는 클래스
ex. 날짜 처리, 문자열 처리, 계산 기능 등 > 객체 생성 없이 사용하는 경우가 많다.
6. This 와 Static
This
현재 메서드를 호출한 객체 자기 자신을 의미한다.
public void setName(String name) {
this.name = name;
}
ex. 같은 클래스로 생성된 객체 p1,p2,p3 중, 어떤 객체가 호출했는지 알아야 데이터 수정 가능
Static
객체 생성 없이, 클래스 이름으로 바로 접근 가능한 멤버이다.
특징
- 기능만 제공하기 때문에 데이터 사용 안함. > DTO,DAO 사용 안함
- This 사용 불가 (현재 객체 자체가 없기 때문)
- Static 메서드의 경우, 호출되는 다른 메서드들도 static 이어야함 !
- Utility, 공통 상수, 상태 없는 기능에서 사용
7. 접근 제한자
객체 간 접근 범위를 제어하기 위한 문법이다.
접근 제한자접근 범위
| public | 모든 클래스 접근 가능 |
| private | 자기 클래스 내부만 접근 가능 |
| protected | 상속 관계에서 접근 가능 |
| default | 같은 패키지 내부만 접근 가능 |
8. 정보 은닉
객체 내부 데이터를 외부에서 직접 수정하지 못하도록 숨기는 개념이다.
보통 멤버 변수는 private로 선언한다.
9. Private 변수에 접근하기 위한 방법
1. Getter, Setter 메서드 + toString() 메서드 사용
Setter : private 상태 변수에 정보 삽입
Getter : private 상태 변수의 정보를 읽어옴.
toString() : 객체가 가진 값 전체를 문자열 형태로 읽어옴.(리턴)
public class Person{
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public String toString(){
return name+age;
}
}
* Setter 메서드 사용 보다는, Change변수명의 메서드를 직접 생성하여 사용하는 걸 권장 > 상태 변경에 있어 추적이 중요하기 때문
Person p = new Person();
p.setName("홍길동");
p.setAge(50);
String name = p.getName();
int age = p.getAge();
System.out.println(p.toString());
2. 생성자 메서드를 이용해 객체 초기화
public class Person{
private String name;
private int age;
Public Person(){
this.name="홍길동";
this.age=50;
}
public String toString(){
return name+age;
}
}
Person p = new Person();
System.out.println(p.toString());
객체 생성시 원하는 값으로 초기화를 원할 경우, 생성자 메서드를 오버로딩해서 초기화
public class Person{
private String name;
private int age;
Public Person(String name, int age){
this.name=name;
this.age=age;
}
public String toString(){
return name+age;
}
}
Person p = new Person("홍길동",50);
System.out.println(p.toString());
'공부 > Java' 카테고리의 다른 글
| 기본 문법(4) (0) | 2026.01.21 |
|---|---|
| 기본 문법(3) (0) | 2026.01.21 |
| 데이터 타입에 따른 저장 방식 (0) | 2024.06.26 |
| BufferReader 와 BufferWriter (0) | 2024.06.26 |
| 기본 문법(2) (0) | 2024.06.25 |