1. 객체 지향 프로그래밍 Object Oriented Programming
🚀 소프트웨어를 개발할 때 부품에 해당하는 객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법
⚒️ 객체지향 이론 기본 개념 : 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용.
⚒️ 발전 단계 : 기본자료형 → 배열 → 구조체 → 클래스
- 구조체는 서로 다른 타입도 하나에 묶을 수 있도록 함
- 구조체가 발전된 형태(함수까지 포함)가 클래스
70년대 - C, 변수와 함수, 구조체
80년대 - C++, 변수와 함수, 구조체, 클래스
90년대 - Java, only 클래스만… 하지만 클래스안에 변수와 메서드가 있음
⚒️ 주요특징
1. 캡슐화 Encapsulation
- 객체의 데이터(필드), 동작(메소드)을 하나로 묶고 실제 구현 내용을 외부에 감추는 것
- 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다
- 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 데 의의가 있다
- 자바 언어는 접근 제한자를 사용하여 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지 결정
2. 상속 Inheritance
- 부모 객체가 자기가 가지고 있는 필드와 메소드를 자식 객체에게 물려줌
- 코드의 재사용성을 높여준다
- 유지 보수 시간을 최소화 시켜 준다
3. 다형성 Polymorphism
- 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말함
- 자동 타입 변환과 재정의 기술이 필요함 ➡️ 상속과 인터페이스 구현을 통해 얻어짐
1) 객체란 ?
👾 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것
👾 객체는 속성과 동작으로 구성 ex. 사람은 이름, 나이 등의 속성과 웃다, 걷다 등의 동작이 있음
➡️ 자바는 이러한 속성과 동작을 각각 '필드 field'와 '메소드 method' 라고 부름
👾 현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링 object modeling 이라고 함
객체의 상호작용
- 현실 세계에서 일어나는 모든 현상은 객체와 객체 간의 상호작용으로 이루어져 있다.
- 객체 지향 프로그램에서도 객체들은 다른 객체와 서로 상호작용하면서 동작함.
- 객체들 사이의 상호작용 수단은 메소드. 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출한다.
// 메소드 호출 형식
메소드(매개값1, 매개값2, ...);
- 메소드 이름과 함께 전달하고자 하는 데이터를 괄호() 안에 기술하는데, 이러한 데이터를 매개값이라고 함.
- 리턴값은 메소드의 실행의 결과이며 호출한 곳으로 돌려주는 값
객체 간의 관계
1. 집합 관계 - 완성품과 부품의 관계를 말함.
ex. 자동차는 엔진, 타이어, 핸들 등으로 구성
2. 사용 관계 - 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계
ex. 사람이 자동차에 달린다, 멈춘다 등의 메소드를 호출
3. 상속 관계 - 부모와 자식 관계.
ex. 자동차가 기계의 특징(필드, 메소드)을 물려받는다면 기계(부모)와 자동차(자식)는 상속 관계에 있음
2) 객체와 클래스
🚀 클래스 Class - 객체를 생성하기 위한 설계도
- 클래스로부터 생성된 객체를 해당 클래스의 '인스턴스 instance' 라고 부른다
- 클래스로부터 객체를 만드는 과정을 인스턴스화라고 함
- 동일한 클래스로부터 여러 개의 인스턴스를 만드는 것 = 동일한 설계도로 여러 대의 자동차를 만드는 것
⚒️ 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적인 의미를 갖고 있다.
3) 객체 생성과 클래스 변수
🚀 클래스로부터 객체를 생성하려면 객체 생성 연산자인 'new' 가 필요
🚀 new 연산자 뒤에는 생성자 호출 코드가 오는데, 클래스() 형태를 가진다.
🚀 객체를 생성시킨 후 객체의 주소를 리턴하기 때문에 클래스 변수에 다음과 같이 대입할 수 있다.
클래스 변수 = new 클래스();
사용 예제
- Student 클래스를 선언하고 StudentExample 클래스의 main() 메소드에서 Student 객체를 생성
public class Student {}
public class StudentExample {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
💡 클래스의 두 가지 용도
- 라이브러리(library) 클래스 : 실행할 수 없으며 다른 클래스에서 이용하는 클래스
- 실행 클래스 : main() 메소드를 가지고 있는 실행 가능한 클래스
- Student는 라이브러리 클래스이고 StudentExample은 실행 클래스라고 볼 수 있음. 일반적으로 자바 프로그램은 하나의 실행 클래스와 여러 개의 라이브러리 클래스들로 구성된다.
4) 클래스의 구성 멤버
🚀 클래스 선언에는 객체 초기화 역할을 담당하는 생성자와 객체에 포함될 필드와 메소드를 선언하는 코드가 포함된다.
1. 필드 field
- 선언 형태는 변수 선언과 비슷하지만 쓰임새는 다름
2. 생성자 constructor
- new 연산자로 객체를 생성할 때 객체의 초기화 역할을 담당.
- 선언 형태는 메소드와 비슷하지만, 리턴 타입이 없고 이름은 클래스 이름과 동일
3. 메소드 method
- 다른 프로그램 언어에서는 함수라고 하기도 하는데, 객체 내부의 함수는 메소드라고 부름
- 메소드는 객체와 객체간의 상호 작용을 위해 호출
5) 필드 선언과 사용
타입 필드명 [ = 초기값];
👾 반드시 클래스 블록에서 선언되어야만 필드 선언이 된다.
👾 필드명은 첫 문자를 소문자로 하되, 캐멀 스타일로 작성하는 것이 관례.
public class Car {
String model = "그렌저"; // 고유 데이터 필드
int speed = 300; // 상태 데이터 필드
boolean start = true; // 상태 데이터 필드
Tire tire = new Tire(); // 부품 객체 필드
}
👾 초기값을 제공하지 않을 경우 필드는 객체 생성 시 자동으로 기본값으로 초기화된다.
public class Car {
String model; // null
int speed; // 0
boolean start; // false
Tire tire; // null
}
필드 사용
👾 필드를 사용한다는 것은 필드값을 읽고 변경하는 것을 말함
👾 필드는 객체의 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않음
👾 필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 객체 외부에서도 접근해서 사용할 수 있다.
⚡️ 객체 내부에서는 단순히 필드명으로 읽고 변경 가능
⚡️ 외부 객체에서는 참조 변수와 도트(.) 연산자를 이용해서 필드를 읽고 변경해야 함
⚡️ 도트는 객체 접근 연산자로, 객체가 가지고 있는 필드나 메소드에 접근하고자 할 때 참조 변수 뒤에 붙임
💡 참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 불가능
필드 VS 변수
구분 | 필드 | (로컬) 변수 |
선언 위치 | 클래스 선언 블록 | 생성자, 메소드 선언 블록 |
존재 위치 | 객체 내부에 존재 | 생성자, 메소드 호출 시에만 존재 |
사용 위치 | 객체 내,외부 어디든 사용 | 생성자, 메소드 블록 내부에서만 사용 |
사용 예제
public class Car {
boolean powerOn; // 시동
String color; // 차량의 색상
int wheel; // 바퀴의 수
int speed; // 속력
boolean wiperOn; // 와이퍼
void power() {
powerOn = !powerOn; // 시동 메서드
}
void speedUp(){
speed++; // 액셀 메서드
}
void sppedDown() {
speed--; // 브레이크 메서드
}
void wiper(){
wiperOn = !wiperOn; // 와이퍼 메서드
}
}
public class CarTest {
public static void main(String[] args) {
Car mycar; // 클래스의 객체를 참조할 수 있는 참조변수 선언
mycar = new Car(); // 클래스의 객체를 생성하고 객체의 주소를 참조변수에 저장
System.out.println("시동 처음 초기화 : " + mycar.powerOn);
System.out.println("차의 색상 초기화 : " + mycar.color);
System.out.println("바퀴의 수 초기화 : " + mycar.wheel);
System.out.println("속력 초기화 : " + mycar.speed);
System.out.println("와이퍼 작동 초기화 : " + mycar.wiperOn);
mycar.power(); // 시동 메서드 실행
System.out.println("시동 메서드 동작 : " + mycar.powerOn);
mycar.power();
System.out.println("시동 메서드 다시 동작 : " + mycar.powerOn);
mycar.color = "black"; // 색상 변수에 black 대입
System.out.println("현재 차의 색상 : " + mycar.color);
}
}
시동 처음 초기화 : false
차의 색상 초기화 : null
바퀴의 수 초기화 : 0
속력 초기화 : 0
와이퍼 작동 초기화 : false
시동 메서드 동작 : true
시동 메서드 다시 동작 : false
현재 차의 색상 : black
* 내용 참고 - 학원강의 및 책 '이것이 자바다'
'Programming Language > JAVA' 카테고리의 다른 글
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.08.10 |
---|---|
[Java] 생성자 Constructor (0) | 2024.08.10 |
[Java] JVM 메모리 구조 · 오버로딩 (0) | 2024.08.09 |
[Java] 메소드 (method) 선언과 구현 · 호출 · 종류 (0) | 2024.08.09 |
[Java] Array | 배열의 활용 · 2차원 배열 (0) | 2024.08.09 |