08. [Java] 객체지향프로그래밍의 이해 / 20230421

2023. 4. 21. 23:11
🧑🏻‍💻 객체 지향 프로그래밍, 클래스와 객체, static, 필드와 메서드

 

💡 클래스(class)란?

➡️ 객체를 정의한 설계도 또는 틀, 객체를 생성하는 데 사용 

클래스는 객체 그 자체가 아니라 단지 객체를 생성하는 데 사용되는 하나의 틀!
  • 인스턴스(instance) : 클래스를 통해 생성된 객체
  • 인스턴스화(intaniate) : 클래스로부터 객체를 만드는 과정 

📍 클래스의 네 가지 구성 요소 

public class Example {
	(1)필드
	(2)메서드
	(3)생성자
	(4)이너 클래스
 }
  1. 필드 : 클래스의 속성을 나타내는 변수, 자동차를 예로 들면 모델명, 컬러, 바퀴의 수...
  2. 메서드 : 클래스의 기능을 나타내는 함수, 자동차를 예로 들면 시동하기, 가속하기, 정지하기...
  3. 생성자 : 클래스의 객체를 생성하는 역할
  4. 이너 클래스 : 클래스 내부의 클래스
✍🏻 생성자를 제외하고 나머지 3 요소 ➡️ "클래스의 멤버"
✍🏻 필드와 메서드는 각각 클래스가 가지는 속성과 기능을 대표

 

💡 객체(Object)

➡️ 모든 실재하는 어떤 대상
➡️ 객체는 클래스에 정의되고 설계된 내용 그대로 생성됨

  • 속성 : 필드로 정의
  • 기능 : 메서드로 정의 

⭐️ 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이루어져 있음 + 이너 클래스 => 객체의 멤버!!

 

📍 객체의 생성

➡️ new 키워드를 사용하여 실제 객체 생성 가능

➡️ 생성한 후에는 포인트 연산자( . ) 통해 해당 객체의 멤버에 접근 가능 

클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장

//간편하게 나타내기
클래스명 참조_변수명 = new 생성자();

🔎 여기서 참조 변수는 실제 데이터값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값 가리킴

🔎 new 는 생성된 객체를 힙 메모리에 넣으라는 의미! 
     => 생성자(클래스와 동일하지만 여기서는 소괄호 붙음)를 통해 객체가 만들어지면 객체를 힙 메모리에 넣는 역할 수행 

⭐️ 생성된 객체에서 필드값은 실제 저장 공간이 객체 내부에 있고 메서드는 다른 영역에 하나만 저장해 놓고 공유한다!

 

📍 객체의 활용 

➡️ 포인트 연산자( . ) : 해당 위치에 있는 객체 안을 보아라

➡️ 포인트 연산자 활용하여 특정 인스턴스 객체의 필드와 메서드, 즉 객체의 멤버들에 접근 가능

참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출

 

 

💡 필드와 메서드 

➡️ 필드는 '클래스에 포함된 변수', 객체의 속성을 정의할 때 사용 

  • 자바에서의 변수 종류 
    • 클래스 변수(cv, class variable) : static 키워드가 함께 선언된 것 
    • 인스턴스 변수(iv, instance variable) : static 키워드가 함께 선언되지 않은 것
    • 지역 변수(lv, local variable) : 위의 두 유형에 포함되지 않고 메서드 내부에 포함된 변수 

✍🏻 셋 중에서 필드라고 부르는 것은 클래스 변수와 인스턴스 변수

✍🏻 세 가지의 변수들은 주로 선언된 위치에 따라 그 종류가 결정되며 가각 다른 유효범위를 가짐 

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

🔎 instanceVariable과 classVariable은 클래스 영역에 선언되었기 때문에 ‘멤버변수’

⭐️ 변수는 주로 선언 위치와 static 키워드의 유무에 따라 구분할 수 있음

 

 

💡static 키워드  👉🏻  모든 객체와 메모리 공유

➡️ 클래스의 멤버(필드, 메서드, 이너 클래스)에서 사용하는 키워드

static 키워드가 붙어있는 멤버 : "정적 멤버"
➡️ static 키워드가 붙어있는 정적 멤버들은 인스턴스 생성없이도 클래스명.멤버명 만으로 사용 가능 

클래스 변수와 인스턴스 변수 비교

➡️ 정적 필드는 객체간 공유 변수의 성질이 있음(메서드에서도 동일하게 적용됨)

➡️ 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없음

 

 

💡 메서드(Method)

➡️ 특정 작업을 수행하는 일련의 명령문들의 집합 

자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처(Method Signiture)
	메서드 내용 // 메서드 바디(Method Body)
}
  • 메서드 시그니처 
    • 해당 메서드가 어떤 타입을 반환하는가(반환 타입)
    • 메서드 이름이 무엇이며 해당 작업을 수행하기 위해서 어떤 재료들이 필요한지(매개변수)에 대한 정보 포함 
void printHello() { // 반환타입이 void인 메서드
	System.out.println("hello!");
}

int getNumSeven() { // 매개변수가 없는 메서드
	return 7;
}

Double multiply(int x, double y) { // 매개변수가 있는 메서드
	double result = x * y;
	return result;
}

// 메서드 이름은 관례적으로 소문자 표시

📍 메서드 반환타입이 void가 아닌 경우에는 return문이 존재해야 함!
      => 작업을 수행한 결과값을 호출한 메서드로 전달, 결과값은 반드시 반환타입과 일치하거나 적어도 자동형변환이 가능한 것!

 

 

🔎 메서드의 호출

➡️ 클래스 멤버이기 때문에 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스 생성해야함
    이후에 포인트 연산자 사용해 메서드 호출 가능

➡️ 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고 서로 호출 가능 

메서드이름(매개변수1, 매개변수2, ...); // 메서드 호출방법. 매개 변수가 없을 수도 있음.

printHello(); // 위의 코드 예제 호출
getNumSeven();
multiply(4, 4.0);

//출력값
hello!
7
16.0
  • 메서드 호출 시 괄호 안에 넣어주는 입력 값 -> 인자(argument)
    • 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개 변수와 일치되어야 함 
    • 인자의 타입 또한 매개 변수의 그것과 일치하거나 자동형변환이 가능한 것이어야 함

 

💡 메서드 오버로딩(Method Overloading)

➡️ 나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것(overload ‘과적하다/부담을 지우다’)

➡️ 이름만 같다고 무조건 오버로딩이 아니라 두 가지 조건이 성립되어야 함 

  • 같은 이름의 메서드명 써주기
  • 매개변수의 개수나 타입이 다르게 정의되어야 함 

📍 이 조건들이 하나라도 충족되지 않으면 중복 정의로 간주

📍 반환 타입은 오버로딩 성립에 영향을 주지 못함
      즉, 반환 타입이 void나 int로 달라도 오버로딩 성립에 영향이 없다는 말!!

 


오늘은 유독 다른 날보다 방대한 지식을 머리속에 밀어 넣은 날. 그래도 다시 보니 정리되지 않고 명확하지 않았던 개념들이 하나씩 정리되는 느낌이다. 이해가 되지 않을 때는 책도 뒤져보고 구글링도 해 보고 gpt에게 질문을 쏟아내기도 하고 찾아가고 알아가는 과정이 즐겁긴 했다. 정리하는 건 힘들지만! 라이브 세션에서 스스로는 이해하기 힘들었던 객체가 생성되고 어떻게 메모리에 저장하는지에 대한 내용들을 잘 설명해 주셔서 당장 완벽하게는 아니지만 그래도 해소된 느낌이었다. 이런저런 밀린 정리나 다 풀지 못한 코플릿도 해결해야지. 주말도 헬주말이 될 것 같은 느낌이다. 파이팅! 

BELATED ARTICLES

more