객체지향 프로그래밍 (OOP)
자바는 객체지향 프로그래밍이다.
이 세상은 모두 객체로 이루어져 있으며 이러한 객체들이 서로 메시지를 주고 받으며 협력함으로써
프로그램을 완성시키는 프로그래밍(OOP) 이라고 볼 수 있다.
-> 즉 객체들을 먼저 만들고 -> 조립해서 완성된 프로그램을 만든다!
1. 객체와 클래스
1.1 객체는 무엇일까?
자신의 고유한 속성과 행동을 통해 구별이 가능한 것을 객체라 부른다.
이때 속성을 필드, 행동을 메소드라고 한다.
1.2 객체의 상호작용
객체는 서로 어떻게 상호작용을 할까? -> 메소드 호출!
1.3 객체지향 프로그래밍의 특징
캡슐화
보호가 필요한(외부에서 접근 및 변경을 막기위해) 필드나 메소드를 접근제한자를 통해서 가려두는것!
상속
상위 개체가 가지고있는 필드와 메소드를 하위 클래스가 상속하여 그대로 사용하여, 추가적인 필드나 메소드만 작성하면 되기에,
후에 유지보수 시에도 상위 클래스만 수정하면 되기에 효율적인 코드 작성을 가능하게 한다.
다형성
메소드 오버라이딩, 메소드 오버로딩을 통해 다형성을 나타낼 수 있다.
같은 타입의 다양한 객체들을 이용해 다양한 실행결과가 나타나게 된다.
1. 부모객체에는 자식객체가 모두 대입될 수 있다.
2.인터페이스에는 해당 구현 객체가 모두 대입될 수 있다.
2. 객체와 클래스
이러한 객체를 만드는 설계도를 클래스라 한다.
클래스를 통해 만들어지는 객체를 인스턴스라 한다.
객체지향 프로그래밍 개발의 세단계
클래스 설계 -> 객체 생성 -> 해당 객체 이용
3. 객체 생성과 클래스 변수
new 를 통해 객체를 생성하고 생성한 객체의 번지를 클래스 변수에 저장한다.
따라서 클래스 변수는 객체를 참조하게 된다
3.1 라이브러리 클래스
외부에서 사용할 목적으로 만들어진 클래스이다.
3.2 실행 클래스
main() 메소드가 포함된 클래스로, 라이브러리 클래스들을 통해 객체를 생성하고 실행한다.
100개의 클래스가 있다면 99개는 라이브러리, 1개는 실행 클래스 라고 볼 수 있다.
4. 클래스의 구성 멤버
4.1 필드
객체의 고유 데이터, 상태 ,부품 등을 저장하는 곳이다.
4.1.1 필드 초기화
- 1. 선언시에 초기화 값을 준다.
public String name = "신몽쉘";
- 2. 생성자의 매개값으로 필드를 초기화 한다.
public class Person {
public String name;
Person(String name){
this.name = name;
}
}
this란 객체 자신의 참조이다! 본인을 가리키는 것!
4.2 생성자
- 객체를 생성할때, 생성자가 호출되면서 객체가 생성된다.
- 생성자는 객체의 초기화를 담당한다.
4.2.1 기본 생성자
- 별도로 생성자를 작성해주지 않으면 컴파일러가 자동으로 기본 생성자를 바이트 코드에 추가 시킨다.
4.2.2 생성자 선언
- 기본 생성자 대신 우리가 객체를 원하는대로 초기화시킬 수 있게 명시적으로 선언할 수도 있다.
- 클래스에 생성자가 명시적으로 선언 되어 있으면,
- 기본 생성자는 호출하지 못해, 반드시 선언된 생성자를 호출해서 객체를 생성해야한다.
4.2.3 생성자 오버로딩
- 매개변수를 달리하여 생성자를 여러번 선언하는것
다른 생성자를 호출하려면? - > this() 사용!!
아래 코드는 생성자내의 중복 코드 반복 발생이다.
public class Person{
Person(){
}
Person(String name){
this.name = name;
this.age = 11;
this.gender = false;
}
Person(String name, int age){
this.name = name;
this.age = age;
this.gender = false;
}
Person(String name, int age, boolean gender){
this.name = name;
this.age = age;
this.gender = gender;
}
}
this()를 사용해서 바꿔보자!
public class Person{
Person(){
}
Person(String name){
this(name,11,fasle);
}
Person(String name, int age){
this(name,age,fasle);
}
Person(String name, int age, boolean gender){
this.name = name;
this.age = age;
this.gender = gender;
}
}
4.3 메서드
메서드는 객체간의 데이터 전달 수단이다.
4.3.1 메서드의 매개 변수 수를 모를 경우
- 1. 매개 변수를 배열 타입으로 선언
int[] values = {1,2,3};
int result(values);
int result(new int[] {1,2,3,4});
이 경우, 메소드를 호출하기 위해선 배열을 생성해야하므로 불편하다.
- 2. ... 으로 선언
int result(int ... values);
result(1,2,3);
리스트만 넘겨주면 되므로 편하다.
4.3.2 메소드 오버로딩
- 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것으로,
- 이때 매개변수의 타입, 개수, 순서 중 하나가 달라야한다.
4.3.3 인스턴스 필드, 메소드
- 인스턴스를 생성한후 사용할 수 있는 필드와 메소드이다.
- 이때 인스턴스 필드는 힙 안의 객체 마다 존재하며,
- 인스턴스 메소드는 객체마다 존재하지 않고 메소드 영역에 저장되고 공유한다.
5. 정적멤버와 static
- 정적(static)은 객체를 생성하지 않고 클래스로 접근하는 멤버이다.
5.1 그럼 필드 선언시 인스턴스 필드로 선언할 것인가? 정적 필드라 선언할 것인가?
- 객체마다 가지고 있어야 하는 데이터인 경우 -> 인스턴스 필드
- 객체마다 가지고 있을 필요가 없는 공용적인 데이터 -> 정적 필드
public class Calculator(){
String color; // 계산기 별로 색깔이 다를 수 있음
static double PI = 3.14; // 계산기에서 사용하는 PI는 동일
}
5.2 정적 초기화 블록
- 정적 필드는 필드 선언과 동시에 초기값을 준다.
- but 계산이 필요한 초기화 작업이 있을 경우
public class TV{
static String company = "samsung";
static String model = "galaxy";
static String ingo;
static{
info = company + model;
}
}
5.3 정적 메소드와 블록선언 시 주의점
- 정적메소드와 정적 블록은 객체가 없이도 실행되기에 내부에 인스턴스 필드나 인스턴스 메소드르 사용할 수 없다.
- 또한 this 사용도 불가능하다.
5.4 싱글톤
- 단하나만 생성되는 객체
5.4.1 싱글톤을 만들려면
- 생성자를 외부에서 호출할 수 없게 만들어야 한다.
public class Singleton{
private Singleton(){}
}
- 내부에서 객체를 생성한다
Singleton singletone = new Singleton();
- 이 객체를 사용할수 있게 반환하는 정적 메소드를 작성한다.
public static Singleton(){
return singleton;
}
6. final 필드와 상수
6.1 final 필드
final 필드는 최종적인 상태의 필드이므로 반드시 초기값을 줘야한다.
1. 필드 시에 준다.
2. 생성자에서 준다.
6.2 상수 (static final)
- 불변의 값을 상수라고 한다.
- 상수는 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러가지 값으로 초기화될 수 없다.
- static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다.
7. 접근 제한자
- 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드,생성자,메서드를 설계해야 한다!
접근 제한 | 적용 대상 | 접근할 수 있는 클래스 |
public | 클래스, 필드, 생성자, 메서드 | 모두 |
protected | 필드, 생성자, 메서드 | 동일 패키지, 자식 클래스 |
default | 클래스, 필드, 생성자, 메서드 | 동일 패키지 |
private | 필드, 생성자, 메서드 | 클래스 내부 |
8.Getter 와 Setter
- 클래스 선언시 private을 선언해서 외부로부터 보호하고,
- 필드에 대한 getter / setter는 메서드를 작성해서 검증 로직을 포함해서 필드값을 변경 및 사용하자!!
'JAVA' 카테고리의 다른 글
[JAVA/개념] 11장 기본 API 클래스 (1) | 2023.07.08 |
---|---|
[JAVA/개념] 인터페이스 (0) | 2023.07.02 |
[JAVA/개념] 상속(extends) (0) | 2023.07.02 |
Lambda (0) | 2023.06.19 |
private, private static, private static final (0) | 2022.07.14 |