OOP(Object-Oriented Programming)
객체지향언어 : 세상을 객체들의 상호작용으로 모델링하여 프로그램을 구성하는 설계방식
객체 : 현실에서 목적과 가치가 있어 독립적으로 식별 가능한 것
객체지향 프로그래밍 : 현실의 객체들간의 상호작용 -> 프로그래밍을 통해 가상세계로 구현하는 것
클래스 : 객체를 만들기 위한 설계도
인스턴스 : 클래스로부터 new 키워드를 통해 생성한 실제 메모리를 가지고 있는 객체
추상화 : 문제 해결에 필요한 속성과 기능만 걸러내서 단순화
추상화 과정
- 내가 구현하고자하는 프로그램에서 필요한 객체가 무엇인지를 생각
- 객체들의 공통저인 속성, 기능을 추출
- 추출한 것들을 내가 구현하고자하는 프로그램의 목적에 맞게 선별
- 최종적으로 추려진 속성들을 어떤 자료형, 어떤 변수명으로 저장할 것인지 정의
Ex) 학생관리프로그램
- 학생 객체, 강사, 반 ...
- 공통속성/기능 수집 : 이름, 나이, 키, 머리색, 신발사이즈, 달리기속도, 점프력 등
- 학생 "인적사항"을 관리 : 이름, 나이, 주소, 주민번호, 전화번호 등
- 이름은 문자열인 String, 나이는 정수인 age, 키는 실수형인 double 등
클래스 구조
접근제한자 class 클래스명 {
필드 영역
사용할 데이터를 선언하는 영역
생성자 영역
데이터를 초기화하기 위해 특수목적의 메서드(생성자)를 정의하는 영역
메서드 영역
클래스의 기능을 정의하는 영역
}
//객체를 생성할 때
//class명 객체이름; -> 해당 class타입의 참조 변수 생성
Student shin;
//객체이름 = new class명(); -> 새로운 class타입의 메모리 공간을 할당해서 주소를 참조
shin = new Student();
//또는 한번에 작성 가능
Student kim = new Student();
shin.name = "신유빈";
shin.age = 20;
kim.name = "김종민";
kim.age = 46;
shin.myInfo();
kim.myInfo();
public class Student {
//필드
String name;
int age;
double height;
//메서드
//내 정보를 출력하는 기능
void myInfo() {
System.out.printf("안녕하세요. 저는 %d살의 %s입니다.\n", age, name);
}
}
Student 클래스의 메서드인 myInfo로 출력.
생성자
기본생성자 : 매개변수가 없는 생성자
- 생성자를 개발자가 정의하지 않으면 컴파일러가 자동으로 생성
- 생성자를 하나라도 정의하면 기본생성자(디폴트생성자)는 생성되지 않음
- 필드를 초기화하기위한 특수목적의 메서드로 class와 이름이 동일하며, 반환타입이 없다.
public class BankAccount {
int balance;
public BankAccount() {
System.out.println("생성자 실행됨.");
}
//생성자
public BankAccount(int balance) {
this.balance = balance;
}
//입금
void deposit(int amount) {
balance += amount;
}
//출금
void withdraw(int amount) {
balance -= amount;
}
//잔액조회
void checkMyBalance() {
System.out.println("잔액 : " + balance);
}
//계좌이체
//내 계좌에서 amount 금액을 target 계롸로 입금
void transfer(BankAccount target, int amount) {
balance += amount;
target.balance -= 1000;
}
}
중간에 생성자에서 this를 사용하여 매개변수인 balance를 그대로 사용하거나 this() 함수를 사용하여 생성자를 호출하여 코드의 재사용성을 늘린다.
public class Run {
public static void main(String[] args) {
BankAccount ac1 = new BankAccount();
BankAccount ac2 = ac1; //주소가 동일해짐.
ac1.deposit(5000);
ac2.withdraw(1000);
ac1.checkMyBalance();
//새로운 ac2 메모리 할당
ac2 = new BankAccount(2000);
ac1.transfer(ac2, 1000);
}
}
new를 사용하면 메모리에 할당되고 ac1은 주소값을 가진다.
또한 ac1과 ac2는 서로 같은 주소를 가지므로, 같은 메모리를 공유한다.
transfer 메서드의 매개변수로 ac2와 1000을 BankAccount 클래스의 메서드 transfer로 넘기고 계산한다.
즉. transfer의 매개변수는 target은 ac2이며, amount는 1000이다.
메서드 오버로딩
메서드는 클래스의 이름을 가지고 매개변수를 받는다.
또한 생성자도 메서드이므로 메서드 오버로딩이 가능하다.
메서드 오버로딩은 메서드 이름이 동일해도 매개변수의 타입, 갯수, 순서에 따라 다른 메서드로 인식된다.
public class Math {
int adder(int n1) {
return n1+ n1;
}
int adder(int n1, int n2) {
return n1 + n2;
}
double adder(double n1, double n2) {
return n1 + n2;
}
String adder(int n1, String ch) {
String addResult = n1 + ch;
return addResult;
}
String adder(String ch, int n1) {
String addResult = ch + n1;
return addResult;
}
}
같은 adder이지만, 매개변수의 타입, 갯수, 순서로 서로 다른 메서드이다.
패키지
클래스간의 공간적 충돌이나 접근 방법의 충돌을 막기 위해 저장 위치를 구분하여 명확하게 접근할 수 있도록 해주는 것이다.
지금까지 사용한 Scanner도 java.util.Scanner를 import해서 사용했다.
따라서 패키지는 import를 통해 불러올 수 있어 그 안의 클래스를 사용할 수 있다.
접근 제어자
접근 제어자의 종류는 Public, Protected, default, private가 존재하며, 각자 가지고 있는 기능이 다르다.
| Public | 다른 패키지 등 이외의 영역에서 사용할 수 있다. |
| Protected | 상속받은 클래스 사용할 수 있다. |
| default | 동일 패키지 내부에서 사용할 수 있다. |
| private | 클래스 내부에서만 사용할 수 있다. |
'JAVA' 카테고리의 다른 글
| JAVA 8일차 (3) | 2025.08.14 |
|---|---|
| JAVA 7일차 (3) | 2025.08.13 |
| JAVA 5일차(2) (0) | 2025.08.11 |
| JAVA 5일차(1) (2) | 2025.08.11 |
| JAVA 4일차(3) (2) | 2025.08.08 |