티스토리 뷰
상태는 행동에 영향을 끼치고 행동은 상태에 영향을 끼칩니다. 객체에서 상태를 나타내는 것은 인스턴스 변수 이고 행동을 나타 내는 것은 메소드 입니다. 만약 Dog 클래스에서 객체의 사이즈에 따라 짓는 방법을 다르게 한다면 객체는 상태에 따라 다른 행동을 하는 것입니다. 반대로 메소드 안에서 인스턴스 변수를 수정한다면 행동에 따라 상태가 달라지는 것입니다. 메소드를 호출 할 때 호출하는 위치에서 필요한 값을 전달하는 것 도 가능합니다.
메소드에서 호출할 때 어떤 값을 전달할 수 있습니다. 만약 사각형의 넓이를 구하는 메소드가 있다고 한다면 그 너비와 높이 값을 인자로 전달할 수 있습니다. 이 때 호출 하는 쪽에서는 전달하는 값을 인자 argument 라고 부르고 메소드 안에서는 매개변수 parameter 라고 구분해서 부릅니다.
이 때 매개변수는 결국 메소드 안에서 사용하는 지역변수 입니다. 그렇기 때문에 다른 변수 처럼 유형이 정해져 있습니다. 메소드를 사용할 때는 이 유형에 맞는 값을 전달해야 하고, 정해진 개수 만큼을 전달해야 합니다. 즉 아무 값도 전달하지 않거나 정해진 매개변수보다 더 많은 것을 전달할 수는 없습니다.
반대로 메소드에서 어떤 값을 돌려 받을 수 있습니다. 메소드를 만들 때 모든 메소드는 리턴 유형을 지정해야 합니다. 그리고 리턴 값은 리턴 유형에 맞는 값이어야 합니다. 리턴 값을 받는 변수는 리턴 유형과 같은 유형이거나 호환 가능한 값이어야 합니다. 리턴 유형이 void 가 아닐때는 리턴 값을 반드시 돌려 주어야 하는것이 원칙입니다.
이렇게 argument를 전달하거나 리턴값을 받을 때 자바에서는 ‘값’으로 전달합니다. 즉, 복사본을 전달하는 것입니다. dog 객체에 있는 play 함수에 인자값으로 t 변수를 넣으면 t 변수 안에 들어있는 비트값이 복사되어 play 메소드의 파라미터인 temp 함수로 넘어갑니다. 그렇기 때문에 메소드 안에서 temp 변수가 바뀌어도 호출한 곳에 있는 변수 t는 변함이 없습니다.
이와 같은 전달 방식을 값에 의한 전달 혹은 pass-by-value 라고 합니다.
자바에서 사용하는 pass-by-value 전달 방식 외에도 변수의 주소값을 전달하는 pass-by-reference 방식이 존재 합니다.
참조에 의한 전달에서는 해당 변수의 주소값이 전달되기 때문에 메소드 안에서 값을 바꾸는 것은 해당 주소에 저장된 값을 바꾸는 것이 됩니다. 때문에 메서드 안에서 값이 바뀌면 인자로 넘어온 변수도 변하게 됩니다.
pass-by-value 방식은 매번 인자를 보내고 매개변수를 받을 때 마다 변수를 생성해서 복사해야 하기 때문에 고비용 문제가 발생합니다 반면 pass-by-reference 방식을 사용 했을 때는 원본 값이 변경 될 우려가 있습니다.
자바는 엄격하게 pass-by-value 를 사용합니다.
지금까지 우리가 만들어 온 클래스에 문제점은 우리의 데이터를 완전히 노출시키고 있었다는 점입니다. 이렇게 인스턴스 변수를 그냥 노출시키면 보안상에 큰 문제가 생길 수도 있습니다. 이 때 캡슐화를 이용해 외부에서 객체 인스턴스 변수에 접근하는 것을 제한할 수 있습니다. 자바에서는 접근 제한자를 이용해서 변수와 메소드에 접근 가능한 정도를 제한할 수 있습니다.
public 은 모든 접근을 허용하고 protected는 같은 패기지와 상속 받은 클래스 에서만 허용합니다. default 는 같은 패키지에서만 접근이 가능하고 private은 현재 객체 내에서만 접근할 수 있습니다.
자바는 이런 접근 제한자를 사용해서 데이터를 보호할 수 있습니다.
실제 코드를 통해 캡슐화를 알아보도록 하겠습니다. 인스턴스 변수 size는 private으로 선언 되어 있기 때문에 다른 객체에서 접근 할 수 없습니다. 이 변수에 접근하려고 하면 setSize(int size), getSize() 메소드를 이용해야만 합니다. (메소드 내에서 잘못된 값을 처리하거나 값을 전달할 때 보안성을 확보할 수 있습니다)
인스턴스 변수와 달리 메소드 안에서 선언 되는 변수는 지역변수라고 합니다. 인스턴스 변수는 모든 메소드에서 사용 가능하지만 지역변수는 선언된 메소드 안에서만 사용 할 수 있습니다. 또 객체 생성 시에 메모리에 올라가서 객체 소멸시에 사라지는 인스턴스 변수와는 달리 지역변수는 메소드 내에서 선언문이 수행 될 때 만들어져서 메소드가 끝나면 사라집니다.
인스턴스 변수는 기본값이 존재하지만 지역 변수는 기본값이 없기 때문에 초기화가 필요합니다. (객체는 다른 클래스의 인스턴스 변수이기 때문에 기본값이 있다)
[기본값 존재 하는 이유, 없는 이유?] -
지역변수의 경우에는 어차피 메소드 안에서만 사용되고 사라지기 때문에 접근 제어자가 필요 없다. 인스턴스 변수의 초기값은 정수형은 0, 실수형은 0.0, 부울은 false, 레퍼런스는 null 입니다.
마지막으로 변수를 비교하는 방법을 알아 보겠습니다. 자바에서 두 변수를 비교하는 것은 이 연산자를 이용 합니다. 이 때 자바의 변수에는 비트값이 들어 있기 때문에 이 연산자를 사용했을 때는 자바 변수에 들어있는 비트를 비교하는 역할만을 합니다. 이는 레퍼런스 변수도 마찬가지로 변수가 가진 비트만을 비교합니다.
'language > JAVA' 카테고리의 다른 글
예외 처리(Exception) (0) | 2019.01.23 |
---|---|
정적 변수, 정적 메소드(static) (0) | 2019.01.23 |
상속(Inheritance)의 개념 (1) | 2019.01.17 |
자바의 변수 원시타입변수 vs 참조타입변수 (1) | 2019.01.17 |
클래스 설계 방법과 객체지향의 4대 특징 (0) | 2019.01.17 |
- Total
- Today
- Yesterday
- Count
- Warning
- 클린코드
- 전략패턴
- 자바스크립트개론
- 경고
- 몰라서망신
- 문장 생성기
- 로그
- 유지보수
- 자바스크립트 개론
- CONVENTIONS
- 마르코프 연쇄
- was
- 크롬
- java
- DP
- html
- markov chain
- Spring in Action
- REST API
- restful api
- Markov
- GROUP BY
- RESTful
- 코딩의 기술
- 디자인패턴
- 마르코프
- 동적계획법
- 야근
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |