개발 공부/JAVA

static / 접근제어자/ getter setter/ final (KOSTA EDU)

공부하는개발자_ 2023. 5. 23. 21:05

 

 

 

클래스 실행순서
1. ConstructorTest.class파일찾기
2. JVM에 로드
3. 바이트코드 검증
4. ConstructorTest.class파일을 재해석(byte->binary)
5. 재해석된 클래스내용은 Method영역에 기억
6. static변수 자동초기화
7. main메서드 호출 

 

 

 

static (정적)변수 ( =class변수)
모든 것을 객체로 표현 할 수는 없다. 
메서드 영역에 탑재됨. 객체들과는 무관한 변수이다. 

프로그램 시작부터 끝날때까지 자리를 차지하고 있어서 메모리 효율성이 떨어진다.

(활용도가 높지 않은 경우 처리할 수 있다면 지양 할 것)

 main메소드가 호출되기 전에 메소드영역에서 자동 초기화 됨. (heap역역이 아님)

 

사용위치 : 멤버변수나 메소드 앞에 사용가능
사용법: 클래스명.변수 

1) a1.si++; 객체.변수 
2) A.si++;클래스이름.변수
2번의 방법 권장.

 

 

class A{

int i; //non-static변수, instance변수

static int si; //static변수, class변수

void m() { //non-static메서드 : 객체 생성 후에만 사용할 수 있는 메소드

i++;

si++;

}

static void sm() { //객체 생성 없이 사용가능한 메소드

//i++; (=this.i++;) 사용불가

//m(); 사용불가

si++;

}

}

public class StaticTest {

public static void main(String[] args) {

A.si++;

System.out.println(A.si);

 

A a1, a2;

a1= new A();

a2= new A();

a1.i++;

a2.i++;

 

a1.si++;

a2.si++;

 

System.out.println(a1.i); //1

System.out.println(a2.i); //1

 

System.out.println(a1.si); //3

System.out.println(a2.si); //3

 

a1.m();

System.out.println(a1.i); //2

System.out.println(a2.i); //1

 

System.out.println(A.si); //4

 

A.sm();

}

}

 

 

final : 끝이다 (abstract과 반대 개념)
사용위치: 클래스, 메소드, 멤버변수, 지역변수 앞에 사용.
-지역변수 앞에 final이 붙으면 변경 불가
-멤버변수 앞에final이 붙으면 변경 불가

-메소드 앞에 붙으면 오버라이드 불가
-클래스 앞에 붙으면 상속 불가

class F{
final int i = 10; //final변수는 값 변경 불가
static final int SI = 10; //상수 (대문자로 만듦)
}

public class FinalTEst {

public static void main(String[] args) {

F f = new F();

System.out.println(f.i);

//f.i++;

 

final int lv;

lv = 10;

//lv++;

 

System.out.println(F.SI);

//F.SI++;

}

}

 

 

접근제어자 (Access Modifier)

public : 누구나 접근 가능

protected : 동일 패키지, 다른 패키지인 경우 상속된 하위 클래스에서 접근 가능

package(default) : 동일 패키지에서 접근 가능 

private : 정보 은닉 용도

멤버변수 : 상수 (public), 변수(private)

캡슐화 : 은닉된 정보를 사용할 수 있도록 만든 통로

 

싱글톤 패턴 (객체생성법)

단 한개의 객체만 생성하고 사용하고 싶을 경우 사용.

핵심: 생성자를 private접근 제한해서 외부에서 new연산자로 생성자를 호출할 수 없도록 막는 것.
정적 메소드를 통해 간접적으로 객체를 얻을 수 있음.

class Single{
static private Single s = new Single();
private Single() {}

static Single getInstance(){

//return null;

//return new Single();

return s;

}

}

public class SingletonTest {

public static void main(String[] args) {

//Single s1 = new Single();

//Single s2 = new Single();

Single s1 = Single.getInstance();

Single s2 = Single.getInstance();

System.out.println(s1 == s2); //false

 

}

}

 

 

자바빈 = 컴포넌트

자바빈의 조건 (확장성이 높아진다)

1) public class

2) public 매개변수 없는 생성자

3) property용 멤버변수는 public이면 안됨

여러 개의 기능 함수를 단일 표준 인터페이스로 묶어 줌으로써 컴포넌트 단위로 재사용하는 기술. 

객체가 갖고 있는 멤버변수의 속성은 public이면 안됨
4) property용 public setter메서드/ getter메서드 필요

- setter/ getter boolean 타입의 시작은 is로 한다

 

Getter/ Setter 
직접적인 외부에서 필드 접근을 막고 메소드를 통해 필드에 접근. 
이유: 메소드는 데이터를 검증해서 유효한 값만 필드에 저장할 수 있기 때문

 

 

 

package com.my.customer.dto;

public class Customer {

private String id;

private String pwd;

private String name;

private boolean flag; //

public void setId(String id) {

this.id = id;

}

public String getId() {

return id;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public String getPwd() {

return pwd;

}

public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setFlag(boolean flag) {

this.flag=flag;

}

public boolean isFlag() {

return flag;

}

}

 

 

 

 

package com.my.asia;

 

public class Korea {

public String capital;

String language;

private int population;

 

public Korea() {

capital = "서울";

language = "한국어";

population = 5174;

}

public void print() {

System.out.println("인구:"+population);

}

/**

* 인구증가한다

*/

 

public void up() {

population++;

}

/**

* 인구감소한다

*/

public void down() {

if(population == 1) {

System.out.println("인구는 0이상이어야합니다");

return;

}

population--;

}

}

 

package com.my.asia;

 

public class Japan {

Korea k;

// Japan(){

// k = new Korea();

// k.capital = "평양";

// k.language = "일본어";

// k.population = -1;

// }

}

 

'개발 공부 > JAVA' 카테고리의 다른 글

상속 (형변환/다형성/overriding)  (0) 2023.05.30
String 구문- charAt(),IndexOf(),subString(),Split()  (2) 2023.05.25
반복문 - for문/ while문  (0) 2023.05.17
조건문 - if문 / swith문  (1) 2023.05.17
자료형 타입/ 연산자  (1) 2023.05.15