Notice
Recent Posts
Recent Comments
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

SYDev

[혼자 공부하는 자바] Chapter 6. 클래스 본문

Programming Lang/Java

[혼자 공부하는 자바] Chapter 6. 클래스

시데브 2025. 1. 23. 23:00

1. 객체 지향 프로그래밍(OOP: Object-Oriented Programming)

  • 객체: 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서, 자신의 속성을 가지고 있으면서 식별 가능한 것
  • 자바에서의 객체 field(속성) method(동작)

1. 1. 객체 간의 관계

  • 집합 관계: 부품 - 완성품
  • 사용 관계: 객체 간의 상호작용
  • 상속 관계: 종류 - 사물

 

1.2. 클래스 선언

  • public 접근 제한자: 파일 이름과 동일한 이름의 클래서 선언에만 붙일 수 있음
  • 보통 소스 파일 하나당 동일한 이름의 클래스 하나를 선언
public class Student {

}

1.3. 객체 생성과 클래스 변수

  • 클래스는 두 가지 용도가 존재 
    • 라이브러리 클래스(Student)
    • 실행 클래스(StudentExample)
public class StudentExample {
	public static void main(String[] args) {
		Student s1 = new Student();
		System.out.println("s1 변수가 Student 객체를 참조합니다.");
		
		Student s2 = new Student();
		System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
	}
}

1.4. 클래스의 구성 멤버

  • 필드: 객체의 데이터가 저장되는 곳
    • 객체의 소멸 시점에 함께 소멸
  • 생성자: 객체 생성 시 초기화 역할 담당
    • 클래스이름과 동일
    • 리턴타입 X
  • 메소드: 객체의 동작에 해당하는 실행 블록

 

2. 필드

 

 

3. 생성자

package ch6;

public class Korean {
	// 필드
	String nation = "대한민국";
	String name;
	String ssn;
	
	// 생성자
	public Korean(String n, String s) {
		name = n;
		ssn = s;
	}
	
	// 생성자 오버로딩
	public Korean(String n, String s, String nat) {
		name = n;
		ssn = s;
		nation = nat;
	}
}

3.1. 다른 생성자 호출: this()

package ch6;

public class Korean {
	// 필드
	String nation;
	String name;
	String ssn;
	
	public Korean(String n) {
		this(n, "111111-1111111", "대한민국");
	}
	
	public Korean(String n, String s) {
		this(n, s, "대한민국");
	}
	
	// 공통 실행 생성자
	public Korean(String n, String s, String nat) {
		name = n;
		ssn = s;
		nation = nat;
	}
}

 

4. 메소드

  • 메소드 선언은 선언부와 실행 블록으로 구성됨
  • method 선언부를 method signature라 부름
package ch6;

public class Calculator {
	// method
	void powerOn() {
		System.out.println("전원을 켭니다.");
	}
	
	int plus(int x, int y) {
		return x + y;
	}
	
	double divide(int x, int y) {
		double result = (double)x / (double)y;
		return result;
	}
	
	void powerOff() {
		System.out.println("전원을 끕니다.");
	}
}

4.1. 매개 변수의 개수를 모를 경우

package ch6;

public class Computer {
	int sum1(int[] values) {
		int sum = 0;
		for(int i = 0; i < values.length; i++) {
			sum += values[i];
		}
		
		return sum;
	}
	
    // 가변인자 -> sum2(1, 2, 3, ...); 형태로 호출
	int sum2(int ... values) {
	int sum = 0;
	for(int i = 0; i < values.length; i++) {
		sum += values[i];
	}
	
	return sum;
	}
}

 

5. 인스턴스 멤버와 정적 멤버

  • instance member: 객체마다 가지고 있는 멤버 -> 객체를 생성한 이후 사용할 수 있는 field&method
  • static member: 클래스에 위치시키고 객체들이 공유하는 멤버 -> 객체를 생성하지 않고도 사용 가능한 field&method
public class ClassName {
    // static field
    static type fieldName [= initialValue];
    
    // static method
    static returnType methodName( param, ... ) { ... }
}

  • Heap 영역의 메모리는 GC에 의해 수시로 관리를 받음
  • Static 영역은 모든 객체가 공유하여 사용할 수 있다는 장점이 있지만, GC에 의해 관리받지 못하기에 프로그램 종료 시점까지 메모리가 할당된 상태 유지 -> 적절한 상황에만 사용해야 함

5.1. Static Block

package ch6;

public class Television {
	static String company = "MyCompany";
	static String model = "LCD";
	static String info;
	
	static {
		info = company + "-" + model;
	}
}

package ch6;

public class TelevisionExample {
	public static void main(String[] args) {
		System.out.println(Television.info);
		
		Television.company = "JustCompany";
		Television.model = "LED";
		
		System.out.println(Television.info);
	}
}

  • static block은 class 로드 시점에 한 번 초기화되기 때문에, 실행 시점에 company, model값을 임의로 변경해도 info의 값은 바뀌지 않는다.

5.2. Instance member 사용 불가

  • static method&static block은 객체가 없어도 실행 가능 -> instance member 사용 불가능, 객체 자신의 참조인 this 사용 불가능
  • 객체를 먼저 생성하고 참조 변수로 접근 시에 가능
static oid Method3() {
    // 객체 생성
    ClassName obj = new ClassName();
    
    // 인스턴스 멤버 사용
    obj.field1 = 10;
    obj.method();
}

 

6. Final 필드와 상수

6.1. final 필드 선언

  • final field: 초기값 = 최종값, 프로그램실행 도중 수정 불가능
  • final field 초기화 방법 2가지
    1. 필드 선언 시에 초기값 대입
    2. 생성자에서 초기값 대입 

6.2. 상수 선언

  • 상수 초기화 방법 2가지
    1. 상수 선언 에 초기화
    2. 선언 이후 static block에서 초기화
static final type 상수 [= initialValue];

 

7. 패키지

7.1. 패키지 선언

  • 패키지 디렉토리는 클래스를 컴파일하는 과정에서 자동 생성
  • 컴파일러는 클래스의 패키지 선언을 보고 디렉토리를 자동 생성
  • 보통 회사 도메인 이름의 역순으로 작성, 마지막에는 프로젝트 이름을 붙여주는 것이 일반적
package 상위패키지.하위패키지;

public class 클래스명 { ... };

7.2. import 문

  • 같은 패키지에 있는 클래스는 조건 없이 사용 가능
  • 다른 패키지에 있는 클래스를 사용하려면 import 문을 이용하여 어떤 패키지의 클래스를 사용하는지 명시
  • import문은 하위 패키지를 포함 X 

 

8. 접근 제한자

접근 제한자 제한 대상 제한 범위
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지거나, 자식 객체만 사용 가능
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부

8.1. 클래스의 접근 제한

  • public: 제한 X
  • default: 같은 패키지에서만 사용 가능

8.2. 생성자의 접근 제한

  • public: 제한 X
  • default: 같은 패키지 내에서는 객체 생성 가능
  • private: 클래스 내부에서만 객체 생성 가능

8.3. 필드와 메소드의 접근 제한

  • public: 제한 X
  • default: 같은 패키지에서만 사용 가능
  • private: 클래스 내부에서만 사용 가능

 

9. Getter와 Setter

  • 객체의 무결성 유지를 위해 사용
  • Setter: 데이터를 검증하여 유효한 값만 필드에 저장
  • Getter: 필드값을 적절히 가공하여 외부에서 사용

  • boolean의 getter는 isName 형식 사용

 

10. 싱글톤 패턴

  • application 전체에서 단 한 개의 객체만 생성해서 사용하는 경우
  • 생성자를 private 접근 제한 -> new 연산자로 생성자 호출 방지
public class 클래스 {
    // private 접근 권한을 갖는 정적 필드 선언과 초기화
    private static 클래스 singleton = new 클래스();
    
    // private 접근 권한을 갖는 생성자 선언
    private 클래스() {}
    
    // public 접근 권한을 갖는 메소드 선언
    public static 클래스 getInstance() {
        return singleton;
    }
}

-> 같은 객체에 접근


참고자료

 

[Java] static변수와 static 메소드

1. Static 정리 Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필

mangkyu.tistory.com