quilt code

[Java] 클래스 (3) 본문

daily/Java

[Java] 클래스 (3)

김뱅쇼 2023. 1. 4. 19:55

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

클래스: 객체의 설계도. 

클래스 멤버(필드, 메소드)는 객체에도 포함되어있어야함

인스턴스 멤버 객체마다 가지고 있는 멤버
정적 멤버 클래스에 위치시키고 객체들이 공유하는 멤버

1) 인스턴스 멤버와  this

인스턴스instance 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드

 

① 인스턴스 멤버 선언

public class car {

//필드
int gas; 

//메소드
void setSpeed(int speed) { ... }
}

>>gas 필드와 setSpeed()메소드는 인스턴스 멤버이기 때문에 외부 클래스에서 사용하기 위해서는 Car 객체(인스턴스)를 생성하고 참조 변수 myCar 또는 yourCar로 접근해야함
Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);

Car yourCar = new Car();
yourCar.gas = 20;
yourCar.setSpeed(80);

② this

  • 객체 외부에서 인스턴스 멤버에 접근하기 위해 참조 변수를 사용하는 것과 마찬가지로 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this 사용할 수 있음
  • this.model은 자신이 가지고 있는 model 필드라는 뜻
Car(String model) {
  this.model = model;
 }

void setModel(String model) {
 this.model = model;
 }

>>매개변수 model의 값을 필드 model에 저장

 

public class CarExample {
  public static void main(String[] args) {
     Car myCar = new Car("포르쉐");
     Car yourCar = new Car("벤츠");

     myCar.run();
     yourCar.run();
   }
 }

2) 정적 멤버와 static

정적 멤버: 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드

 

① 정적 멤버 선언: 필드와 메소드 선언할 때 static 키워드를 추가적으로 붙이면 됨

public class 클래스 {
   //정적 필드
   static 타입 필드 [= 초기값];

  //정적 메소드
   static 리턴 타입 메소드( 매개변수선언, ... ) { ... }
  }

② 정적 멤버 사용

  • 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(,)연산자로 접근
  • 클래스.필드;                                                                                                                                                                      클래스.메소드( 매개값, ... );

ex)

public class Calculator {
   static double pi = 3.14159;
   static int plus(int x, int y) { ... }
   static int minus(int x, int y) { ... }
 }

 

double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5);

**주의할 점**

  • 객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 x
  • 객체 자신의 참조인 this 키워드도 사용 x

3) 싱글톤 

  • 단 하나의 겍체만 만들도록 보장해야 하는 경우-> 하나만 생성됨 -> 싱글톤
  • 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야함 (why? 생성자를 호출한 만큼 객체가 생성되기 때문)
  • 생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private을 붙여줌
  • 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화함
  • 클래스 내부에서는 new 연산자로 생성자 호출이 가능함

4) final 필드와 상수

① final 필드 :

  • 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중 수정할 수 x
  • final 타입 필드 [=초기값];
  • final 필드의 초기값을 줄 수 있는 방법 (필드 선언 시에 주는 방법 / 생성자에서 주는 방법)

② 상수:

  • 불변의 값 static fina, 원주율 파이, 지구의 무게 및 둘레->불변의 값을 저장하는 필드를 자바에서는 상수라고 함
  • final 필드 =/= 상수

6. 패키지와 접근 제한자 

  • 패키지 사용이유? 클래스를 체계적으로 관리하기 위해
  • 패키지: 파일 시스템의 폴더 기능 + 클래스의 일부분으로서 클래스를 유일하게 만들어주는 식별자 역할
  • 상위패키지.하위패키지.클래스
  • 패키지 이름 규칙: 숫자로 시작x, _,$을 제외한 특문 사용 불가. java로 시작하는 패키지 불가. 모두 소문자로 작성

1) import 문

사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면 import 문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야함 (같은 패키지에 있으면 안써도 ok)

import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;

import문은 패키지 선언과 클래스 선언 사이에 작성 

 

2) 접근 제한자

접근을 제한하기 위해 사용 (접근: 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근)

 

public 접근 제한자 외부 클래스가 자유롭게 사용할 수 있음
protected 접근 제한자 같은 패키지 또는 자식 클래스에서 사용됨
private 접근 제한자 외부에서 사용될 수 없음

위 세가지 접근 제한자가 적용되지 않으면 default 접근 제한을 가짐

*default 접근 제한: 같은 패키지에 소속된 클래스에서만 사용

'daily > Java' 카테고리의 다른 글

[Java] 상속  (0) 2023.01.16
[Java] 클래스 (4)  (0) 2023.01.11
[Java] 클래스 (2)  (0) 2023.01.03
[Java] 클래스(1)  (0) 2023.01.02
[Java] 참조타입 과제  (0) 2023.01.02