자바 클래스 1

Dear·2025년 5월 15일

TIL

목록 보기
22/74

💙 클래스

어떤 목적을 달성하기 위해 필요한 기능들과 변수들을 하나로 묶어 분리 시켜 놓은 모듈

두 개 이상의 클래스가 선언된 소스 파일을 컴파일하면 바이트 코드 파일(.class)은 클래스를 선언한 개수만큼 생긴다. 소스파일은 클래스 선언을 담고 있는 저장 단위일 뿐, 클래스 자체가 아니다.

파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다.

public class Car{ }
class Tire{ }
// Car.class, Tire.class 각각 생성

// 객체만 생성 
new 클래스();

메모리 내에서 생성된 객체의 위치를 모르면 객체를 사용할 수 없다. 그래서 new 연산자는 힙 영역에 객체를 생성 후, 객체의 주소를 리턴한다. 이 주소를 참조 타입인 클래스 변수에 저장해 두면(변수는 스택 영역), 변수를 통해 객체를 사용할 수 있다.

// 클래스 타입으로 선언된 변수에 new 연산자가 리턴한 객체의 주소를 저장
클래스 변수 = new 클래스(); // 클래스 변수 선언과 객체 생성

'new 연산자로 객체를 생성'하고 '리턴한 객체의 주소'를 변수에 저장하면 변수가 객체를 참조한다.

같은 클래스로부터 생성되어도 각각 생성된 객체는 자신만의 고유한 데이터를 가지면서 메모리에서 활동한다.
-> 각각 객체는 완전히 독립된 서로 다른 객체

클래스 용도

라이브러리(API)용과 실행용으로 두 가지 용도가 있다.
프로그램 전체에서 클래스가 100개면 99는 API, 1개는 실행 클래스이다. 실행 클래스는 프로그램의 실행 진입점인 main() 메소드를 제공하는 역활을 한다.

💙 클래스의 구성 멤버

필드(field)

변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 소멸한다.
필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸하지 않는 한 객체와 함께 존재한다.
생성자와 메소드 중괄호 블록 내부에서 선언된 것은 필드가 아닌 로컬 변수이다.

생성자

new 연산자로 호출된다. 객체 생성 시 초기화를 담당한다. 생성자는 클래스 이름으로 되어 있고 리턴 타입이 없다. 생성자와 클래스 이름은 다를 수 없다.

메서드(method)

객체가 수행할 동작(기능) 을 정의하는 코드 블록이다.
메서드는 입력(매개변수)을 받아서 처리하고, 결과(리턴값)를 반환한다.

💙 매개 변수의 수를 알 수 없는 경우 메서드 작성

어러 개의 수를 모두 합산하는 메소드를 선언해야할때 몇 개의 매개 변수가 입력될지 알 수 없어서 매개 변수의 개수를 결정할 수 없다.

그럴 경우 매개 변수를 배열 타입으로 선언하거나 … 을 사용해서 값의 리스트만 넘겨주면 된다.

public class Computer {
	int sum1(int[] values) {
		int sum = 0;
		for(int i=0; i<values.length; i++) {
			sum += values[i];
		}
		return sum;
	}
	
	int sum2(int ... values) {
		int sum = 0;
		for(int i=0; i<values.length; i++) {
			sum += values[i];
		}
		return sum;
	}
}
---------------------------------------------------------------------
public class ComputerExample {
	public static void main(String[] args) {
		Computer myCom = new Computer();
		
		int[] values1 = {1, 2, 3};
		int result1 = myCom.sum1(values1);
		System.out.println("result1: " + result1);
		
		int result2 = myCom.sum1(new int[] {1, 2, 3, 4, 5});
		System.out.println("result2: " + result2);		
		
		int result3 = myCom.sum2(1, 2, 3);
		System.out.println("result3: " + result3);
		
		int result4 = myCom.sum2(1, 2, 3, 4, 5);
		System.out.println("result4: " + result4);
	}
}

💙 패키지

클래스를 체계적으로 관리하기 위해서 패키지(package)사용한다.

패키지가 다르면 같은 이름의 클래스를 생성할 수 있다.

접근 제한자

Getter와 Setter 메소드

객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨질 수 있다. 그래서 Getter와 Setter를 통해 객체 외부에서 직접적으로 접근하는 것을 막는다.

어노테이션

애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할것인지 알려주는 정보이다.

다음 세 가지 용도로 사용한다.

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공 @Override
  • 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
  • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공

생성자에게는 어노테이션을 적용할 수 없다.

리플렉션

런타임 시에 클래스의 메타 정보를 얻는 기능이다.

클래스가 가지고 있는 필드가 무엇인지, 어떤 생성자를 갖고 있는지, 어떤 메소드를 가지고 있는지, 적용된 어노테이션이 무엇인지 알아내는 것이다.

🤍 회고

자바의 클래스, 객체, 메서드, 패키지, 접근 제한자 등 다양한 개념을 익히는 과정에서 메모리 구조와 객체 참조 개념이 헷갈렸다. 관련 내용을 정리 노트를 만들어 체계적으로 정리하고, 다양한 예제 코드를 수정하고 분석하면서 원리를 파악했다. 특히 String의 메모리 구조, 얕은·깊은 복사의 차이, 패키지 구조화를 직접 비교하고 정리했다. 이를 통해 단순 이해를 넘어 개념 간의 연관성과 동작 방식을 스스로 설명할 수 있게 됐다.

profile
친애하는 개발자

0개의 댓글