1. 객체지향 프로그래밍이란?
- 객체 : 주체가 아닌 것, 주체가 활용하는 것
- 객체지향 프로그래밍 : 주변의 많은 것들을 객체화 해서 프로그래밍 하는 것
2. 객체지향 프로그래밍 장점
- 블록 형태의 모듈화된 프로그래밍(ex. 레고)
- 신뢰성 높은 프로그래밍이 가능
- 추가/수정/삭제가 용이
- 재 사용성이 높다.
3. Class와 Object
- 현실의 객체가 갖는 속성과 기능은 추상화되어 클래스에 정의된다.
- 클래스는 구체화 되어 프로그램의 객체가 된다.
- 설계도는 하나의 종류가 되고 설계도를 통해 나온 제품을 객체라고 부르며 주체가 사용
- 객체는 클래스를 데이터 타입으로 메모리에 생성되어 실제로 동장하는 것
4. 객체 생성
public class Person {
// 객체의 속성, 데이터
String name;
int age;
boolean isHungry;
// 객체의 기능, 동작
public void eat() {
isHungry = false;
}
public void work() {
isHungry = true;
}
}
public class PersonTest {
public static void main(String[] args) {
int age = 10;
Person p1 = new Person(); // heap 메모리에 객체 저장
p1.name = "홍길동";
p1.isHungry = true;
System.out.println(p1.name + " : " + p1.isHungry);
p1.eat();
System.out.println(p1.name + " : " + p1.isHungry);
Person p2 = new Person();
p2.name = "임꺽정";
System.out.println(p2.name + " : " + p2.age + " : " + p2.isHungry);
}
}
5. 객체 생성과 메모리
- JVM의 메모리 구조 : meta-space, stack, heap 3가지로 구성
- meta-space : 클래스 정보 처리(타입, 필드, 메서드 정보) ,코드
- stack : 메서드의 실행 공간(쌓이는 구조), 쓰레드 별로 별도 관리, 메서드 프레임에 로컬변수도 쌓이는 구조
- heap : 객체를 저장하기 위한 영역, 쓰레드에 의해 공유, 객체가 생성되고 가비지 컬렉션에 의해 정리, 상수 풀
6. 인스턴스 멤버 변수
- 선언 위치 : 클래스 {} 영역 내에 선언
- 객체가 만들어질 때 heap에 객체 별로 생성
- 생성 시 default 초기화
- 객체 이름으로 접근
- G.C에 의해 객체가 없어질 때 소멸
7. 클래스 멤버 변수
- 선언 위치 : 클래스 {} 역역 내에 선언, static 키워드를 붙임
- 클래스가 로딩 될 때 heap에 클래스 별로 생성
- 생성 시 default 초기화
- 개별 객체의 생성과 무관하며 모든 객체가 공유
- 클래스가 언로드 될 때 G.C에 의해 소멸
- 변할 수 있는데 거의 변하지 않는다.
- "클래스명.변수명"으로 접근하는게 올바른 방법
8. 지역 변수 & 파라미터 변수
- 선언 위치 : 클래스 영역의 {} 외에 모든 중괄호 안에 선언되는 변수
- 선언된 라인이 실행될 때 stack에 생성
- 생성 시 default 초기화 X
- 외부에서는 접근 불가
- 선언된 영역인 {}을 벗어날 때 소멸
9. 메서드
- 객체가 하는 동작을 프로그래밍 화
- 반복, 중복 방지
- "제한자 (static) 리턴타입 메서드이름(매개변수) {}" 로 선언
- 매개변수에 값을 넘겨줄 때 묵시적 형변환이 일어난다.
- "addAll(int... params)" >> ...을 사용하면 자동으로 배열 생성 및 초기화가 가능하다
10. 메서드 호출
- static : 같은 클래스에서는 자유롭게 사용, 다른 클래스에서는 "클래스명.멤버명"
※ static >> 메모리에 먼저 올라가있어라!
※ static안에는 staic만 non-static안에는 non-static과 static 둘 다 가능
- non-static : 같은 클래스에서는 바로 호출, 다른 클래스에서는 객체 생성 후 "객체명.멤버명"
11. Overloading (오버로딩)
- 동일한 기능을 수행하는 메서드의 추가 작성
- 같은 메서드 명, 매개변수의 개수, 순서, 타입이 달라야 한다.
- 리턴타입은 의미 없음.
- 코드 재사용
12. 생성자
※ 생성자 : 객체를 생성할 때 호출하는 메서드 비슷한 것
- 클래스와 이름이 동일
- new 키워드와 함께 호출되는 것
- 반환타입이 없어야 한다.
13. 디폴트 생성자
- 클래스 정의 시 명시적으로 정의된 생성자가 없을 경우 컴파일러가 자동으로 생성해서 제공하는 생성자
- "접근제한자(클래스와 동일) "클래스이름() {}"
14. 파라미터가 있는 생성자
- 생성자 호출 시 값을 넘겨줘서 초기화
- 파라미터가 있는 생성자를 만들면 기본 생성자는 추가 되지 않는다. (디폴트 생성자를 추가 작성)
15. 인스턴스 메서드와 생성자의 차이점
- 인스턴스 메서드 : 생성된 이후에 호출이 가능(언제든지 호출 가능)
- 생성자 : 생성될 때 한번만 호출
16. this
- 참조 변수로써 객체 자신을 가리킴
- this를 이용해서 자신의 멤버(변수, 메서드)에 접근 가능
- static 영역에서 사용 불가
Person(String name) {
this.name = name;
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
============= 변경 =================
Person(String name) {
this(name, 0); // 가장 위에 써야한다.
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
'Web > JAVA' 카테고리의 다른 글
예외 처리(exception handling) (0) | 2024.01.22 |
---|---|
abstract class, Interface, generic (0) | 2024.01.19 |
데이터 은닉(Encapsulation), 다형성(Polymorphism), Singleton (0) | 2024.01.18 |
상속(Inheritance), overriding, package, import, 제한자 (0) | 2024.01.17 |
기본 문법, 배열 (0) | 2024.01.15 |