24.09.04(생성자, 접근제어자, static)

jiiiiiiiArchive.·2024년 9월 5일

🤯지식주머니🤯

목록 보기
9/98
post-thumbnail

생성자(Constructor)

  • 객체가 생성될 때 호출됨. => new 키워드가 사용될 때 호출
    • 특수 목적의 메소드로 객체의 초기화를 위해 사용
  • 객체 변수에 값을 무조건 설정해야만 객체가 생성될 수 있도록 강제
  • 생성자가 선언된 경우 생성자의 규칙대로만 객체를 생성할 수 있음.
  • 규칙
    • 클래스명과 동일
    • 리턴 타입을 정의하지 않는다(void도 사용하지 않는다.).
    • 객체가 생성될 때 자동으로 한번 호출
    • 매개변수 조건에 따라 여러개 작성 가능
    • 클래스에 최소 1개 존재
    • 생성자 코드가 없을 경우 컴파일러가 기본생성자를 자동으로 생성
  • 예제
클래스에 기본생성자와 매개변수를 가진 생성자를 정의했을 경우
public class Book {
	String title;
	int price;
		
	public Book() { // 기본생성자
    	
    } 
	
	public Book(String title, int price) {    // 매개변수를 가진 생성자
		this.title = title;
		this.price = price;
	}

	public void showPrice() {
		System.out.println(title + "의 가격은 " + price + "원 입니다");
	}
}

public class Main {
	public static void main(String[] args) {
		Book b1 = new Book();               // 객체생성 - 기본생성자 호출됨
		Book b2 = new Book("국어책", 3000); // 객체생성 - 매개변수를 가진 생성자 호출됨
		
		b1.showPrice();
		b2.showPrice();
	}
    
    // 결과 : null의 가격은 0원 입니다
             국어책의 가격은 3000원 입니다
}
클래스에 기본생성자 없이 매개변수를 가진 생성자만 정의했을 경우
public class Book {
	String title;
	int price;
	
	public Book(String title, int price) {       // 매개변수를 가진 생성자
		this.title = title;
		this.price = price;
	}

	public void showPrice() {
		System.out.println(title + "의 가격은 " + price + "원 입니다");
	}
}

public class Main {
	public static void main(String[] args) {
		Book b1 = new Book();                // Error발생 (기본생성자 자동생성 안됨) 
                                             // 생성자 정의가 1개라도 되어 있다면 컴파일러는 기본 생성자를 자동생성해주지 않음
		Book b2 = new Book("국어책", 3000);
		
		b1.showPrice();
		b2.showPrice();
	}
}

접근제어자(Access Modifier)

  • 변수나 메서드의 사용 권한 설정
  • 종류
    • private
      • 해당 클래스 안에서만 접근 가능
    	public class Sample {
    		private String secret;
    		private String getSecret() {
        		return this.secret;
    		}	
		}
        // secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근 가능
        // 다른 클래스에서는 접근 불가능
  • default
    • 접근제어자를 별도로 설정하지 않는 경우 default 접근제어자가 자동으로 설정
    • 동일한 패키지 않에서 접근 가능
> house/HouseKim.java
package house;  // 패키지가 동일하다.

public class HouseKim {
    String lastname = "kim";  // lastname은 default 접근제어자로 설정된다.
}


> house/HousePark.java
package house;  // 패키지가 동일하다.

public class HousePark {
    String lastname = "park";

    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        System.out.println(kim.lastname);  // HouseKim 클래스의 lastname 변수를 사용할 수 있다.
                                          // 결과 : kim
    }
}
  • protected
    • 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근 가능
> house/HousePark.java
package house;  // 패키지가 서로 다르다.

public class HousePark {
    protected String lastname = "park";
}


> house/person/JiseongPark.java
package house.person;  // 패키지가 서로 다르다.

import house.HousePark;

public class JiseongPark extends HousePark {  // HousePark을 상속했다.
    public static void main(String[] args) {
        EungYongPark jsp = new EungYongPark();
        System.out.println(jsp.lastname);  // 상속한 클래스의 protected 변수는 접근이 가능하다.
                                          // 결과 : park
    }
}
  • public
    • 어떤 클래스에서도 접근 가능
package house;

public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message.";
}
  • 접근 제어자를 이용하면 프로그래머의 실수 방지 및 기타 위험 요소 제거 가능

static

  • 공유되는 변수나 메서드를 정의할 때 사용
  • 메모리 할당을 딱 한번만 하게 됨 => 메모리 적게 사용
  • 값 공유
    • static으로 설정하면 같은 메모리 주소만 바라보기 때문에 static 변수의 값 공유
  • 메모리의 효율을 높이기 위한 목적보다는 공유의 목적으로 훨씬 더 많이 사용
profile
이것저것 다 적는 기록장📚

0개의 댓글