[21.07.14] Access Modifier
객체 안의 값이 어떻게 변하는지 파악을 잘해야합니다.
equals()
equals() 함수는 비교연산자 ==, != 이랑 같은 동작을 하는 것 같지만 만약 비교할 대상이 참조타입이라면? 비교연산자는 주소값을 비교하게 됩니다. String은 참조형 변수라 ==으로 비교된 문자열과 equals(문자열)은 저장된 공간이 달라서 비교하는 값이 달라져요!
(21.07.21 수정)
equals()의 원래 기능은 객체가 같은지 비교하는 것인데 문자열을 비교하면 eqauls()는 데이터 내용을 비교하는거고 ==는 주소값을 비교합니다.
접근제한 수식어(Access Modifier)
종류 | 의미 |
---|---|
public | 어디에서든 접근할 수 있음 |
protected | 같은 패키지에 있거나 상속받은 클래스까지 접근할 수 있음 |
private | 선언된 클래스 안에서만 접근할 수 있음 |
package | 같은 패키지에 있는 클래스들만 접근할 수 있음 (생략 가능) |
* 사용범위 : private < package < protected < public
멤버변수, 메소드, 생성자, 클래스에 대한 접근권한을 설정하는 수식어입니다. 단, 클래스는 package, public만 쓸 수 있어요. 객체를 public으로만 만들 경우 이곳저곳에서 쓰게되었을 때 원하는 결과의 값이 나오지 않는 문제가 생길 수 있거든요. 특정 기능에서만 사용해야할 클래스는 private를 주로 씁니다!
public class Test{
private int n1;
int n2;
protected int n3;
public int n4;
---------------------------
Main{
Test t1=new Test();
이렇게 main클래스에서 인스턴스를 생성했을 때 private 멤버변수인 n1은 감추어져 보이지 않아요~
class의 접근제한 수식어
public class : 어디서든지 인스턴스 생성이 가능
(package) class : 같은 패키지에 속한 클래스들에서만 인스턴스 생성. import가 불가능한 클래스
주의할 점이 있는데 public class의 이름은 반드시 java 파일의 이름과 같아야해요. 그리고 하나의 java파일에 여러 개의 클래스를 정의하는건 가능하지만 public class는 오직 하나만 존재해야합니다.
캡슐화
클래스를 설계할 때 멤버변수를 private로 선언하여 외부 클래스에서 필드들에 직접 접근해 읽거나 쓰지 못하게 하는 게 캡슐화예요. 다만 필요한 경우 생성자 만들 때 혹은 public 메소드를 정의해 private 멤버변수를 간접적으로 읽고 쓰기는 가능합니다. 캡슐화를 통해 코딩을 하면 main이 짧아지고 유지보수와 가독성이 좋아지겠죠?
객체안의 객체
public class MyNumber {
private int number;
.
.
.
public MyNumber add(MyNumber number) {
this.number+=number.number;
return this;
}
}
러시아인형 마트료시카처럼 객체안에 객체가 존재하는 형태로 쓸 수 있어요. 클래스는 하나의 데이터 타입이니깐 리턴타입과 매개변수의 데이터타입으로 클래스타입을 지정하고 사용할 수 있다는 것~
Main{
MyNumber x=new MyNumber(1);
MyNumber y=new MyNumber(2);
MyNumber z=new MyNumber(3);
MyNumber end =new MyNumber(4);
x.add(y).add(z).add(end);
System.out.println(x.getNumber());
System.out.println("===================");
MyNumber r1=x.add(y);
MyNumber r2=r1.add(z);
MyNumber r3=r2.add(end);
System.out.println(r3.getNumber());
}
위의 둘은 같은 동작을 하는 코드입니다. 위의 코드는 단계가 없이 한방에 덧셈한거고 아래쪽은 a->b->c 흐름순으로 계산한 방식입니다.
[문제] 두 점 사이의 거리 측정하기
두 점 사이의 거리 d = √(x1-x2)² + (y1-y2)²
Math.sqrt() : double값의 제곱근(√)을 double로 반환함.
public class Point {
//멤버변수
private double x, y;
//생성자
public Point() {}
public Point(double x, double y) {
this.x=x;
this.y=y;
}
//getter/setter 메소드
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
//두 점 사이의 거리를 리턴하는 메소드
public double distance(Point pt) {
double d = Math.sqrt((this.x - pt.x) * (this.x - pt.x) + (this.y - pt.y) * (this.y - pt.y));
return d;
}
}
Point{}
Scanner sc = new Scanner(System.in);
Point pt1=new Point();
Point pt2=new Point();
System.out.println("첫번째 x값 입력>>");
pt1.setX(sc.nextDouble());
System.out.println("첫번째 y값 입력>>");
pt1.setY(sc.nextDouble());
System.out.println("두번째 x값 입력>>");
pt2.setX(sc.nextDouble());
System.out.println("두번째 y값 입력>>");
pt2.setY(sc.nextDouble());
System.out.println("두 점 사이의 거리 : "+pt1.distance(pt2));
sc.close();
Main{}
tip💡
- 에디터에서 오른쪽 마우스 source>... superclass : 기본생성자 생성
- 에디터에서 오른쪽 마우스 source>... using fields : 매개변수를 가진 생성자 생성
- 에디터에서 오른쪽 마우스 source>... getter and setter : getter와 setter 생성
수업 외 공부🔍
- 선택 정렬
가장 작은 수를 찾아 맨 앞의 숫자와 교체하고 맨 앞을 제외하고 다시 반복하는 정렬방법입니다.
[4 2 1 5 8 6]
1 2 4 5 8 6 i=0, j=0~5
12 4 5 8 6 i=1, j=1~5
1 24 5 8 6 i=2, j=2~5
1 2 45 8 6 i=3, j=3~5
1 2 4 56 8 i=4, j=4~5
- i = 0~length-1, j = i~length까지 반복
- j가 반복할 때마다 조회한 최솟값을 배열의 [i]값에 넣고 최솟값이 있던 자리에는 [i]값 넣기
for(int i=0;i<select.length-1;i++) {
int min=Integer.MAX_VALUE;
for(int j=i;j<select.length;j++) {
if(min>select[j]) {
min=select[j];
temp=j;
}
}
select[temp]=select[i];
select[i]=min;
}
Author And Source
이 문제에 관하여([21.07.14] Access Modifier), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yeddoen/21.07.14-Access-Modifier저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)