본문 바로가기
JAVA

[클래스] 제어자 & 필드의 구분

by amoomar 2022. 1. 1.
반응형

 

 

이번 포스팅에서는 접근권한제어자의 종류와 활용, 필드의 구분(변수의 범위)에 대해 다루었다.

 

 


 

1. 접근권한제어자

 

1) 종류

 

  1. default : 프랜들리라고도 한다. 같은 패키지에서 접근 가능하다.
  2. public : 다른 패키지에서도 접근이 가능하다. 한 패키지에 여러 클래스를 만드는 경우 메인 클래스에만 public이 붙는다.(다른 클래스에는 default가 붙어있지만 생략되어있다.)
  3. protected : 같은 패키지에서 접근 가능하다.
  4. private : 해당 클래스(선언된 영역)에서만 접근 가능하며, 개발자들끼리 서로 주의를 줄 목적으로 주로 사용한다.

 


 

2) getter&setter

: private가 선언된 클래스에서 선언하며, public제어자를 붙여 다른 클래스or다른 패키지에서도 private에 접근할 수 있도록 해준다.

 

① getter

: 데이터 가져오기를 목적으로 한다. 사용은 객체명.get변수명();으로 가능하다.

class Student{
	String name;
	pivate int score;

	Student(String name){
		this.name = name;
    	this.score = 70;
	}
	public int getScore(){ //getter선언
		return score;
	}
}

 

 

② setter

: 데이터 변경(넣기)을 목적으로 한다.

class Student{
	String name;
	pivate int score;

	Student(String name){
	this.name = name;
    	this.score = 70;
	}
	public int setScore(int score){ //setter선언
		this.score = score;
	}   
}
main{
	Student stu1 = new Student("왕밤빵");
	stu1.setScore(100); //수정 가능
}

* getter&setter선언 단축키 : alt + shift + S + R *

 

 


 

 

2. 필드의 구성

클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미한다. 클래스 내에서 필드는 선언된 위치에 따라 다음과 같이 구분된다.

 

1) 지역변수(stack영역)

  • 지역(필드) 안에서 선언된 변수
  • 사용자가 직접 초기화해야한다.
  • 그 영역의 닫는 중괄호" } "를 만났을때 메모리에서 해제된다.
  • 다른 영역에서 접근할 수 없기 때문에 보안성이 뛰어나다.

 

2) 전역변수(data영역)

  • 클래스영역 안에 있고, 전체 영역 안에서 사용가능한 변수
  • 멤버변수, 인스턴스변수라고도 하며, 각 객체끼리 값을 공유하지 않는다.
  • 클래스영역외의 어떠한 영역에도 포함되어있지 않다.
  • 다른 영역에서도 접근할 수 있기 때문에 보안성이 상대적으로 낮다.
  • new를 만났을때 초기화되고, 프로그램 종료시 메모리에서 해제된다.

 

3) 클래스변수(data영역)

  • Static변수, 정적변수라고도 하며, 객체끼리 그 값을 공유한다(공유자원)
  • 컴파일을 하게되면 가장 먼저 메모리에 올라가고, 어떠한 경우에도 초기화되지 않는다.
  • 단, 프로그램 종료시 메모리에서 해제된다. 메모리에 고정되기 때문에 남용시 메모리와 프로그램 실행속도에 악영향을 준다.

 


 

3. 예제

 

: 한 계좌에서 여러개의 카드가 발급될 수 있도록 하고, 카드 별명을 설정. 비밀번호는 입력하면 설정 가능하고, 설정하지 않으면 1111로 자동 설정된다. 잔액 부족시 결제가 진행되지 않도록 코딩.

 

package class04;

import java.util.Scanner;

class Card{
	String name;
	int pw;
	static int money = 100000;

	Card(String name){
		this(name, 1111);
	}

	Card(String name, int pw){
		this.name = name;
		this.pw = pw;
	}

	void use(int money) {
		this.money -= money;
		if(this.money < 0) {	//0보다 외부money값이랑 비교하는게 더 낫지 않을까?
			this.money += money;
			System.out.println("결제가 진행되지 않습니다 : 잔액부족");
		}
	}
}
public class Test06 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String name = null;
		int pw=0;
		int money=0;

		//카드개수설정
		System.out.println("발행할 카드 개수 입력 : ");
		int cnt = sc.nextInt();
		Card[] card = new Card[cnt];

		//카드정보 입력
		for(int i=0; i<card.length; i++) {	//별명을 먼저 입력하면
			System.out.println("생성할 " + (i+1) + "번 째 카드 별명: ");
			name = sc.next();

			System.out.println("비밀번호를 설정하시겠습니까?[y/n]");	//비번설정여부
			String choice = sc.next();

			if(choice.equals("y")) {
				System.out.println("생성할 " + (i+1) + "번 째 카드 P/W: ");
				pw = sc.nextInt();
				card[i] = new Card(name, pw);
			}else if(choice.equals("n")) {
				System.out.println("초기 비밀번호는 1111입니다.");
				card[i] = new Card(name);
			}
		}
		//카드의 사용
		int i=0;
		while(true) {
			System.out.println(card[i].name+"의 사용 금액 입력: ");
			money = sc.nextInt();
			//결제비번 입력
			while(true) {
				System.out.println("비밀번호 입력: ");
				pw = sc.nextInt();

				if(pw == card[i].pw) { //비번이랑 입력한 비번이랑 같으면
					card[i].use(money); //use 사용
					//잔액을 볼 수 있는 메서드가 딱히 없으니 그냥 공용함수 조회
					System.out.println( "잔액 : " + card[i].money + "원");
					break;
				}else {
					System.out.println("비밀번호가 잘못 입력되었습니다.");
				}
			}
			if(card[i].money <0) {
				card[i].use(money);
				break;
			}
			i++;
			if(i>=card.length) {
				i=0;
			}
		}
	}
}
반응형

'JAVA' 카테고리의 다른 글

[다형성] 클래스배열 & Casting  (0) 2022.01.01
[상속] 상속과 Overriding  (0) 2022.01.01
[클래스] 객체지향 코딩 & 생성자  (0) 2022.01.01
[알고리즘] 퀵정렬  (0) 2021.12.31
[알고리즘] 버블정렬 & 이진탐색  (0) 2021.12.31