본문 바로가기
Web/JAVA

클래스, 객체, 메서드, 변수, 생성자

by 당진개발자 2024. 1. 16.

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;
}