Java 프로그래밍 : 객체지향 (2) 접근제어자, get(), set(), 스코프

준우·2022년 4월 15일
0

Java

목록 보기
2/30
post-thumbnail

접근제어자

계좌 비밀번호, 잔액 등 특정 인물에게만 접근을 허용해야하는 중요 정보는 접근제어자를 통해 접근 및 수정이 불가하도록 관리할 수 있다. 접근제한자의 종류는 아래와 같다.

  • public : 완전 공개
  • protected : 상속 범위 내 공개
  • default : 같은 패키지 내 공개
  • private : 비공개

접근제한자 중 가장 폐쇄적인 키워드는 private 으로, 외부 접근을 막으며 데이터를 완전히 비공개한다. 하지만 게터 메소드(getter methods)세터 메소드(setter method)를 사용하면 비공개 필드에 우회적으로 접근해 private 필드를 반환(get) 하거나 변경(set) 할 수 있다.

class Main{
	public static void main(String agrs[]){
		Account acc = new Account(123456, "SD@#!", 1000);
	}
}

class Account{
	public int number;
    private String password;
    private int balance;
    
    public Account(int number, String password, int balance){
    	this.number = number;		//계좌번호
        this.password = password;	//비밀번호
        this.balance = balance;		//통장잔액
    }
    
}

만약 위와 같은 코드로 생성된 acc 계좌가 있다고 하자. 접근제어자가 없다면 누구든 쉽게 아래와 같은 해킹 코드를 만들어서 Hacker.malcious(acc); 명령어로 간단하게 통장 잔액을 0원으로 변경할 수도 있을 것이다.

class Hacker {
  // 클래스 메소드 - 계좌의 잔액을 0원으로 변경
  public static void malcious(Account account) {
    account.balance = 0;
  }
}

하지만 private 접근제어자로 선언된 경우, 아래와 같이 게터 메소드와 세터 메소드를 사용해야만 우회적으로 비공개 된 정보에 접근할 수 있게 된다.


public void setPassword(String Pw) {
	password = pw;
}

public int getBalance(){
	return balance;
}

게터 메소드와 세터 메소드를 작성하는 방법은 get/set + private 변수명이나, 변수의 맨 앞글자는 대문자로 작성해야 한다. (ex. private int password 인 경우, 메소드 이름은 setPassword(int pw))

그리고 getter method와 setter method는 모두 public으로 선언하며, setter method의 경우, 반환하는 값이 없으므로, void를 사용한다.

메소드의 구조는 public 리턴타입 메서드명() { } 이므로 getter method와 같이 반환값이 있는경우 해당 데이터의 타입을 적어주면 된다.

스코프 (scope)

변수의 활동영역을 스코프(scope)라고 한다. 필드의 활동 영역은 클래스 전체이며, 메소드 호출 시에도 필드를 사용할 수 있다. 이러한 필드의 활동 영역 “클래스 스코프”이다. 그리고 메소드의 활동 영역은 "메소드 스코프" 이다. 메소드 내부에 선언된 변수를 파라미터, 혹은 지역변수라고 부른다.

메소드 스코프 : 메소드 내부에서 활동 (예 - 파라미터, 지역변수)
클래스 스코프 : 클래스 전역에서 활동 (예 - 필드)

스코프 관련하여 주의할 점은, 변수의 이름이 같은 경우이다.
아래와 같은 코드를 예시로 들어보자.

class Dog{
	//필드
	int age; 
    String name;
    
    //메소드
    public Dog(int age, String name){
    age = age;
    name = name
    }
}

필드는 클래스 전체가 활동 영역이고, 메소드는 메소드 내부에서만 사용된다.
int age, String name은 스코프가 겹치므로 어느 변수의 값을 가져야할지 명확하지 않다.

따라서 이 경우에는 this 를 사용해 아래와 같이 수정해야 한다.
this, 여기 메소드 내부에서 사용하겠다는 의미이다.

class Dog{
	int age; 
    String name;
    
    public Dog(int age, String name){
    this.age = age;
    this.name = name
    }
}

자바 API

자바 API는 프로그래밍을 위해 미리 JAVA에서 준비한 도구들이라고 할 수 있다. 도구들은 "패키지" 라고 불리는 일종의 폴더에 위치하며, 패키지의 그룹화를 통해 관련 API를 한데 묶고, 이름은 같지만 내용이 다른 것을 분류화한다.

자바 API를 사용하기 위해서는 코드 상단에 아래와 같은 형식으로 import 해야 한다. 아래는 java.util 패키지의 모든 클래스를 사용할 수 있는 코드다.

import java.util.*;

일반적으로 가장 많이 사용하는 클래스는 Math, Random, ArrayList 이다. Math 클래스는 수학 관련 기능을 제공하며, Random 클래스는 임의의 수를 생성할 수 있고, ArrayList는 향상된 배열로, 객체를 저장할 수 있다.

자바 API에 대해서 추가적으로 상세한 내용을 알고 싶은 경우 오라클 홈페이지에서 확인할 수 있다. 영문으로 작성되어 있어 필요 시 번역 도구를 사용하기를 바란다.

🙏 참고 강의

0개의 댓글