반응형
이번 포스팅에서는 접근권한제어자의 종류와 활용, 필드의 구분(변수의 범위)에 대해 다루었다.
1. 접근권한제어자
1) 종류
- default : 프랜들리라고도 한다. 같은 패키지에서 접근 가능하다.
- public : 다른 패키지에서도 접근이 가능하다. 한 패키지에 여러 클래스를 만드는 경우 메인 클래스에만 public이 붙는다.(다른 클래스에는 default가 붙어있지만 생략되어있다.)
- protected : 같은 패키지에서 접근 가능하다.
- 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 |