자바

자바 - 클래스 - 02

로기221 2023. 1. 11. 08:56
728x90
반응형

인스턴스 멤버

인스턴스 멤버 선언 및 사용

  • 인스턴스 멤버 : 필드와 메소드 등 객체에 소속된 멤버

 

this 키워드

  • 객체 내부에서는 인스턴스 멤버에 접근하기 위해 this를 사용. 객체는 자신을 'this'라고 지칭
  • 생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우, 인스턴스 필드임을 강조하고자 할 때 this를 주로 사용

 

정적 멤버

 

정적 멤버 선언

  • 정적 멤버 : 메소드 영역의 클래스에 고정적으로 위치하는 멤버
  • static 키워드를 추가해 정적 필드와 정적 메소드로 선언
public class 클래스 {
//정적 필드 선언
	static 타입 필드 [= 초기값];
// 정적 메소드
	static 리턴타입 메소드(매개변수, ...) {...}
}

 

 

 

정적 멤버 사용

  • 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음
  • 클래스 이름과 함께 도트(.) 연산자로 접근
public class CalcuatorExample {
static double pi = 3.14159;
		static int plus(int x, int y) {
			return x + y;	
		}		
		static int minus(int x, int y) {
			return x - y;
        }
}
  • 정적 필드와 정적 메소드는 객체 참조 변수로도 접근

 

 

정적 블록

  • 정적 필드를 선언할 때 복잡한 초기화 작업이 필요하다면 정적 블록을 이용
  • 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행
  • 정적 블록이 클래스 내부에 여러 개가 선언되어 있을 경우에는 선언된 순서대로 실행
  • 정적 필드는 객체 생성 없이도 사용할 수 있기 때문에 생성자에서 초기화 작업을 하지 않음

 

 

인스턴스 멤버 사용 불가

  • 정적 메소드와 정적 블록은 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없으며 this 도 사용할 수 없음
  • 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근
static void method3 {
	//객체 생성
	ClassName obj = new ClassName();
    // 인스턴스 멤버 사용
	obj.field1 = 10;
	obj.method1();

 

 

final 필드와 상수

 

final 필드 선언

  • final 필드는 초기값이 저장되면 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없게 됨
  • final 필드에 초기값을 주려면 필드 선언 시에 초기값을 대입하거나 생성자에서 초기값을 대입
final 타입 필드 [=초기값];

 

 

상수 선언

  • 상수 : 불변의 값을 저장하는 필드
  • 상수는 객체마다 저장할 필요가 없고, 여러 개의 값을 가져도 안되기 때문에 static이면서 final
static final 타입 상수 [=초기값];

 

 

 

패키지 

 

자바의 패키지

  • 클래스의 일부분이며, 클래스를 식별하는 용도
  • 패키지는 주로 개발 회사의 도메인 이름의 역순으로 만듦
  • 상위 패키지와 하위 패키지를 도트(.)로 구분
  • 패키지에 속한 바이트코드 파일(~.class)은 따로 떼어내어 다른 디렉토리로 이동할 수 없음

 

 

 

패키지 선언

  • 패키지 선언은 package 키워드와 함께 패키지 이름을 기술한 것, 항상 소스 파일 최상단에 위치
package 상위패키지. 하위패키지;

public class 클래스명 { ... }
  • 패키지 이름은 모두 소문자로 작성. 패키지 이름이 서로 중복되지 않도록 회사 도메인 이름의 역순으로 작성하고, 마지막에는 프로젝트 이름을 붙여줌
com.samsung.projectname
com.lg.projectname
org.apache.projectname

 

 

 

Improt 문

  • 다른 패키지에 있는 클래스를 사용하려면 import 문을 이용해서 어떤 패키지의 클래스를 사용하는지 명시
package com.mycompany;

import com.hankook.Tire;

public class Car {
//필드 선언 시 com.hankook.Tire 클래스를 사용
	Tire tire = new Tire();
}
  • import 문은 패키지 선언과 클래스 선언 사이에 작성. import 키워드 뒤에는 사용하고자 하는 클래스의 전체 이름을 기술

 

 

 

접근 제한자

 

접근 제한자

  • 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성을 유지하기 위해서 접근 제한자 사용

  • 접근제한자는 public, protected, private의 세가지 종류

 

 

 

 

클래스의 접근 제한

  • 클래스를 선언할 때 public 접근 제한자를 생략하면 클래스는 다른 패키지에서 사용할 수 없음
  • 클래스를 선언할 때 public 접근 제한자를 붙이면 클래스는 같은 패키지뿐만 아니라 다른 패키지에서도 사용할 수 있음

 

 

생성자의 접근 제한

  • 생성자는 public, default, private 접근 제한을 가질 수 있음
public class ClassName{
	//생성자 선언
    [public | private] ClassName(...) { ...}
}
접근 제한자 생성자 설명
public 클래스(...) 모든 패키지에서 생성자를 호출할 수 있다.
= 모든 패키지에서 객체를 생성할 수 있다.
  클래스(...) 같은 패키지에서만 생성자를 호출할 수 있다.
=같은 패키지에서만 객체를 생성할 수 있다.
private 클래스(...) 클래스 내부에서만 생성자를 호출할 수 있다.
= 클래스 내부에서만 객체를 생성할 수 있다.

 

 

 

 

필드와 메소드의 접근 제한

  • 필드와 메소드는 public, default, private 접근 제한을 가질 수 있음
// 필드 선언
[ public | private ] 타입 필드;

//메소드 선언
[ public | private ] 리턴타입 메소드(...) {...}
접근 제한자 생성자 설명
public 필드
메소드(...)
모든 패키지에서 필드를 읽고 변경 할 수 있다.
모든 패키지에서 메소드를 호출 할 수 있다.
  필드
메소드(...)
같은 패키지에서만 필드를 읽고 변경 할 수 있다,
같은 패키지에서만 메소드를 호출 할 수 있다,.
private 필드
메소드(...)
클래스 내부에서만 필드를 읽고 변경 할 수 있다.
클래스 내부에서만 메소드를 호출 할 수 있다.

 

 

 

Getter와 Setter

 

Setter

  • 데이터를 검증해서 유효한 값만 필드에 저장하는 메소드

 

Getter

  • 필드값이 객체 외부에서 사용하기에 부적절한 경우, 적절한 값으로 변환해서 리턴할 수 있는 메소드
private 타입 fieldName;

//Getter 
public 타입 getFieldName() {
	return fieldName;
}

//Setter
public void setFieldName(타입 fieldName) {
	this.fieldName = fieldName;
}

 

 

Getter와 Setter 
객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질수 가있다.
ex) 자동차의 속력은 음수가 될 수 없는데, 외부에서 음수로 변경하면 객체의 무결성이 깨진다.

Car myCar = new Car() ;
myCar.speed = -100;

객체 지향 프로그래밍에서는 직접적인 외부에서의 필드 접근을 막고 대신 메소드를 통해 필드에 접근하는 것을 선호한다,

private double speed;

private : 같은 클래스 내부에서는 접근 가능
setter를 통해서 같은 내부에 있는 private 필드에 접근해서 값을 변경
getter를 통해서 같은 내부에 있는 private 필드에 접근해서 값을 가져온다

 

public void setSpeed(double speed) { 
    if (speed < 0) {
        this.speed = 0;
    return;
    } else {
        this.speed = speed;
    }
}

 

public double getSpeed() {         // speed 가 마일로 되어 있을때 km 환산

    double km = speed * 1.6;

    return km;

}

 

 

 

 

싱글톤 패턴

 

싱글톤 패턴

  • 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아서 외부에서 마음대로 객체를 생성하지 못하게 함
  • 대신 싱글톤 패턴이 제공하는 정적 메소드를 통해 간접적으로 객체를 얻을 수 있음
public class 클래스 {
	// private 접근 권한을 갖는 정적 필드 선언과 초기화
    private static 클래스 singleton = new 클래스 () ;
    
    // private 접근 권한을 갖는 생성자 선언
    private 클래스() {}
    
    //public 접근 권한을 갖는 정적 메소드 선언
    public static 클래스 getInstance() {
    	return singleton;
        }
    }

싱글톤 패턴
애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤(singleton) 패턴을 적용할 수 있다.
싱글톤 패턴의 핵심은 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출 할 수 없도록 막는 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'자바' 카테고리의 다른 글

자바 - 인터페이스  (0) 2023.01.16
자바 - 상속  (0) 2023.01.12
자바 - 클래스 - 01  (0) 2023.01.10
자바 - 참조 타입  (0) 2023.01.09
자바 - 조건문과 반복문  (0) 2023.01.06