이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.
그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.
그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.
이번에 접근 제한자라는 것을 배울것이다.
사실 이 개념을 처음 배우는 입장에서 왜 필요한지 모를것이다.
왜냐하면 없는게 더 나은개념같다고 느껴질 것이기 때문이다.
접근 제한자라는 것은 다른 클래스에서 내 클래스의 필드나 메소드에 대한 접근을 막는 것이다.
이 때까지 우리는 접근을 막지 않았다. 정확히 말하면 쪼~~금은 다른개념이지만.
이게 참... 현실에서 예를들기 조금 힘들다.
프로그래밍 하다가 협업하기 불편해서 나온 개념이라서 그런지 설명하기 매우 애매하다.
그래도 굳이 설명을 해보자면 "나는 너에게 필요한것만 공개하겠다. 나머지는 비밀." 이라는 개념이다.
개념자체는 어렵지 않다. 왜 필요한지 처음에 안 와닿을 뿐.
아래는 우리가 이떄까지 일반적이게 보아왔던 예제 코드이다.
public class Square {
int x;
int y;
public Square(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
public static void main(String[] args) {
Square s = new Square(10, 20);
s.x = 7;
s.y = 5;
}
}
위의 코드에서 Square는 Main에서 사용하고 있다.
여기서 우리는 Main에서 Square의 필드인 x와 y에 직접접근하고 있다.
그러나 이러한 코드는 비권장이다.
특정 클래스에서 다른 클래스의 필드에 직접접근하는것은 특별한 상황을 제외하곤 옳지않다.
특별상황이 무엇인지는 차차 논하도록 하자.
어쨋던 저런 값들을 다른 클래스에서 못쓰게 만드는 방법이 있다.
바로 private라는 키워드이다. 이제 squre에 private를 걸어보자.
public class Square {
private int x;
private int y;
public Square(int x, int y) {
this.x = x;
this.y = y;
}
}
private라는 키워드를 필드의 앞에 사용하였다. 이제 위의 메인을 다시 실행해보자.
아마 에러가 뜰것이다.
에러가 뜨면서 되지 않는다. 무슨 오류인고 확인해보니 Squre들의 필드들이 보이지 않는다고 한다.
즉 Main클래스에서는 Square의 멤버에 접근할 수 없는 것이다.
이제 Square의 멤버들은 오직 Square클래스 안에서만 수정할 수 있다.
그럼 x와 y를 난 너무 바꾸고 싶다! 이럴 경우 어떻게 해야하는가?
이 경우 Square 클래스를 만든 사람이 수정할 수 있게 만들어 놨다면(여기서는 여러분이지만 실무에서는 누가만들지 모른다.)
그 수정하는 가이드라인인 메소드를 통해서수정하면 된다.
만약 안만들어 놨다면? 수정 못하는 거다. 정확히 말하면 존재 조차도 모를 것이다.
여기서는 여러분이 Square를 만들었으므로 Square를 수정하여 접근하게 할 수 있다.
아래 처럼 코드를 만들어보자.
public class Square {
private int x;
private int y;
public Square(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
public class Main {
public static void main(String[] args) {
Square s = new Square(10, 20);
s.setX(7);
s.setY(5);
}
}
이렇게 만들면 에러가 나지 않는다. 여기서 또다른 키워드를 보았다. 바로 public이다.
이 public키워드의 의미는 모두에게 오픈한다는 이야기이다.
public을 사용해서 만들면 그 누구도 손쉽게 접근 할 수 있다.
즉 우리는 square의 x와 y를 수정하기 위해서 getX와 getY, setX와 setY를 만들었다.
이는 x와 y를 직접적으로 수정하는게 아니라 Square클래스에게 물어봐서 우회적으로 수정하는 것을 의미한다.
쉽게말해서 x와 y를 호출하는것은 내가 가서 직접 바꾸는것이고
setX 와 setY를 사용하는 것은 내가 Square한테 바꿔달라고 요청하면 Square가 바꿔주는 방식인 것이다.
이러한 get,set을 접근자와 설정자라고 한다.
get - 접근자 키워드, Getter라고도 한다.
set - 설정자 키워드, Setter라고도 한다.
사실 접근자와 설정자는 자바의 문법에 귀속되어있지는 않다. 그러나 매우 빈도높게 사용되므로 반드시 알아두자.
여러분은 public과 private를 알았다.
그러나 이때까지의 예제에서는 아무것도 적지 않았다.
아무것도 없다고 해서 접근제어자가 없는것이 아니다. 이렇게 기본적인 접근제한자를 package접근제한자라고 한다.
접근 제한자는 총 4종류가 있다.
public - 모두에게 오픈, 접근제한자로 public이라고 적는다.
protected - 상속관계+같은 패키지내에 오픈, 접근제한자로 protected라고 적는다.
package - 같은 패키지내에 오픈, 접근제한자르 적지 않는다.
private - 같은 클래스내에서 오픈, 접근제한자로 private라고 적는다.
아직 상속을 배우지 않았으므로 protected는 조금 뒤에 이야기하도록 하고, package를 한번보자.
package com.jiharu.package_test.core;
public class Square {
private int x;
private int y;
public Square(int x, int y) {
this.x = x;
this.y = y;
}
int getX() {
return x;
}
void setX(int x) {
this.x = x;
}
int getY() {
return y;
}
void setY(int y) {
this.y = y;
}
}
만약 Square의 getter와 setter가 package로 되어있다.
여기서 Main으로 접근할 수 있을까? 한번 테스트 해보라.
이렇게 다른 패키지에서는 접근할 수 없다.
따라서 접근제한자의 허용도는 아래와 같다.
public>protected>package>private
가끔씩 package 접근제한자를 default 접근제한자라고 부르는 서적도 있다.
그러니 만약 default접근제한자라고 되어있다면 package 접근제한자라 생각하자.
여기서 궁금한 점이 있을것이다.
이렇게 빙글빙글 돌아가게 만드는 이유가 무엇이냐 이다.
사실 이 부분을 설명하기는 좀 쉽지 않다.
일반적으로 각 제한자의 의미는 아래와 같다.
public - 일반적으로 대부분의 메소드에는 public이 붙는다. 필드의 경우 정말 누가봐도 getter와 setter가 필요없다 싶을 경우만 쓰는데 상황에 따라 다르다. 보통 협업할때는 필드는 public을 사용하지 않는 편이 좋다.
protected - 일반적으로 오버라이딩이 필요한 메소드에 사용한다. 필드에는 일반적으론 사용치 않는다.
package - 패키지 내에서 서로 굉장히 의존도가 높은 클래스들의 의존도 높은 필드나 메소드에 사용한다. 사람마다 재량권이 많이 부여되서 사용하는 사람도 있고 안 사용하는 사람도 있다.
private - 일반적으로 대부분의 필드는 private가 붙는다. 만약 판단하기 애매하다면 모든 필드에 private를 붙히는게 좋다.
아직 여러분이 판단하기 애매하다면 모든 메소드에는 public을, 그리고 모든 필드는 private를 걸어서 사용하자.
협업하다 보며는 왜 이걸 쓰는지 이해하게 될것이다.
'Programming > Java' 카테고리의 다른 글
[Java-17]super와 Overriding(오버라이딩) (0) | 2017.10.24 |
---|---|
[Java-16]상속(Inheritance) (0) | 2017.10.24 |
[Java-14]초기화와 초기화블럭(Initialize Block) (0) | 2017.10.21 |
[Java-13]package와 import (0) | 2017.10.21 |
[Java-12]static (0) | 2017.10.05 |