목차
1. 변수의 종류
2. 메서드
1. 변수의 종류
변수에는 클래스변수, 인스턴스 변수, 지역 변수 총 3가지가 있다. 변수의 종류를 결정짓는 중요한 요소는 ' 변수가 선언된 위치'이다. 멤버 변수를 제외하고는 모두 지역변수이다. 멤버 변수는 클래스 내의 변수로서 클래스 변수와 인스턴스 변수로 나뉜다.
변수의 종류 | 선언 위치 | 생성시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스 생성 시 | |
지역변수 | 클래스 영역 외의 영역 | 변수 선언문이 수행되는 경우 |
인스턴스 변수
인스턴스 변수는 인스턴스마다 독립된 저장공간을 가지므로, 인스턴스마다 서로 다른 값을 가질 수 있다. 각각의 인스턴스마다 고유한 상태를 유지해야 하는 속성의 경우, 인스턴스 변수로 선언해야 한다.
클래스 변수
멤버 변수 중 클래스 변수는 static이 붙어있어 구분이 가능하다. 인스턴스마다 독립적으로 저장공간을 갖는 인스턴스 변수와 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유한다.
클래스 변수는 인스턴스변수와 달리, 인스턴스를 생성하지 않고도 바로 사용할 수 있다.
예를 들어 사람이라는 클래스를 만든다고 하자. 사람이라는 틀에 미영이 민주, 석동이 같은 사람 인스턴스를 생성할 수 있다. 이들 인스턴스는 각각 나이와 이름이 다를 것이다. 하지만 사람이라는 것은 모두가 공통적으로 가지고 있는 속성이다.
따라서 나이와 이름은 인스턴스 변수, 사람은 클래스 변수로 설정한다. 아래는 코드 예제이다.
코드예제
public class Person {
// 클래스 변수
static String type = "사람";
// 인스턴스 변수
int age;
String name;
}
class Ex {
public static void main(String[] args) {
// Person 객체 생성
Person miYoung = new Person();
Person minJu = new Person();
//이름 나이 넣기
miYoung.age = 25;
minJu.age = 21;
miYoung.name = "miYoung";
minJu.name = "minJu";
// 공유되는 클래스 변수 호출
System.out.println("클래스 변수는 직접 호출 가능 = " + Person.type);
System.out.println("minJu.type = " + minJu.type);
System.out.println("miYoung.type = " + miYoung.type);
// 이름 호출
System.out.println("minJu.name = " + minJu.name);
System.out.println("miYoung.name = " + miYoung.name);
}
}
지역 변수
메서드 내에 선언되어 메서드 내에서만 사용되는 변수이다. 메서드가 종료되면 소멸된다.
코드예제
int returnAdd (int x, int y){
int answer = x + y;
return answer;
}
이 예제에서 answer이 바로 지역변수이다. 메서드가 종료되면 소멸된다.
2. 메서드
메서드는 특정 행위를 하는 문장들을 하나의 덩어리로 묶은 것이다.
2.1 메서드의 장점
1. 높은 재사용성
한번 만들어놓은 메서드는 몇 번이든 호출해 재사용할 수 있다.
2. 코드의 중복 제거
코드 작성시 같은 내용의 문장들이 여러번 반복되는 경우가 있는데 이를 하나의 덩어리로 묶어 한 문장으로 대체할 수 있다. 코드의 길이도 짧아지고, 코드를 수정할 때도 메서드 하나만 수정하면되니 매우 편리해진다.
3. 프로그램 구조화
메서드를 활용하여 작업 단위로 구분해줄 수 있다.
코드예제
initNum() // 1. 초기화
calculateNum() // 2. 계산
printNum() // 3. 출력
2.2 메서드의 구조
메서드는 선언부와 구현부로 구성되어 있다.
코드예제
int returnAdd (int x, int y){
int answer = x + y;
return answer;
}
선언부
int returnAdd (int x, int y)
반환타입 메서드 이름 매개변수선언(입력)
반환타입은 반드시 구현부의 return 타입과 맞아야 한다.
또한 매개변수입력부분에 두 개가 들어가도록 메서드가 선언되어 있으면, 들어가는 인자도 반드시 2개여야한다.
구현부
{
return x + y;
}
메서드에 실행되었을 때 수행될 문장이 들어간 부분이다. return 타입은 반드시 선언부의 반환타입과 맞춰줘야 한다.
2.3 메서드의 호출과정
코드예제
public class MethodEx {
public static void main(String[] args) {
Calculator calculator = new Calculator();
int result = calculator.returnAdd(3, 5);
System.out.println("result = " + result);
//result = 8
}
}
class Calculator {
// 메서드
int returnAdd (int x, int y){
int answer = x + y;
return answer;
}
}
위의 코드는 아래와 같은 방식으로 동작한다.
1. 3, 5라는 두개의 값이 복사된다.
2. returnAdd 메서드의 x, y에 복사된 3, 5값이 들어간다.
3. x + y 의 계산이 되어 8이라는 결과를 얻고 이를 answer에 넣는다.
4. answer를 return한다.(return과 동시에 answer은 사라진다. 지역변수이므로)
5. return된 8이라는 값이 result에 들어간다.
여기서 3, 5 처럼 함수안으로 들어가는 값을 Argument라고 하고
함수의 선언부의 int x, int y를 Parameter라고 한다.
둘이 혼용되어 쓰이기도 한다.
2.3 메서드의 return 문
반환 타입
return 문은 현재 실행중인 메서드를 종료하고 이를 호출한 메서드로 다시 되돌아가게 하는 것이다. 반환값은 반드시 선언부의 반환타입과 맞아야 한다. void 의 경우 return 값이 없으므로 그냥 return;만 입력해주면 된다.
void 코드 예제
void returnNone() {
return;
}
* 참고
void의 경우 return을 작성하지 않아도 컴파일러가 컴파일 시 return문을 작성해준다.
반환값
return 문의 반환 값으로 결과가 아닌 수식이 올 수도 있다. 이 때 수식이 아닌 수식을 계산한 결과가 반환된다.
코드예제
// 메서드
int returnAdd (int x, int y){
return x + y;
}
2.4 기본형 매개변수와 참조형 매개변수
자바에서 메서드를 호출할 때 인자에 매개변수를 복사해서 넘겨준다. 이때 타입이 기본형일 때는 값이 복사되지만, 참조형일 때는 인스턴스의 주소가 복사된다.
따라서 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기때문에 그 주소를 참조해 값을 읽거나 변경까지 할 수 있다.
기본형 매개변수 | 변수의 값을 읽기만 가능하다. |
참조형 매개변수 | 변수의 값을 읽고 변경할 수 있다. |
기본형 코드예제
public class ParameterEx {
public static void main(String[] args) {
int a = 30;
change(a);
// 변경 시도 후 a 출력
System.out.println("a = " + a);
// a = 30 <- 20으로 변하지 X
}
static void change(int x) {
// 변경 시도
x = 20;
}
}
기본형 매개변수는 변수에 저장된 값만 읽을 수 있을 뿐, 변경할 수는 없다.
참조형 코드예제
public class ReferenceParameterEx {
public static void main(String[] args) {
Number number = new Number();
number.x = 3; // 객체 number의 멤버변수 x를 3으로 초기화
System.out.println("초기화 직후 number.x = " + number.x);
// 초기화 직후 number.x = 3
// 참조형 변수 변경
change(number);
// 변경 후 출력
System.out.println("참조형 변경 후 number.x = " + number.x);
// 참조형 변경 후 number.x = 555
}
static void change(Number number) {
number.x = 555;
}
}
참조형은 변경이 가능하다.
2.5 참조형 반환 타입
반환타입도 참조형이 될 수 있다. 간단한 코드 예제를 통해 알아보자.
코드예제
public class ReferenceReturnEx {
public static void main(String[] args) {
Data returnedData = returnData();
System.out.println("returnedData.num = " + returnedData.num);
// returnedData.num = 555
}
static Data returnData() {
Data data = new Data();
data.num = 555;
return data;
}
}
class Data {
int num = 3;
}
returnData메서드를 통해 num이 555인 data 객체의 주소를 return 받는다.
출력해보면 555가 나오는 것을 알 수 있다. ( 555는 객체의 주소를 참고해 그 값을 출력한 것이다.)
2.6 클래스 메서드와 인스턴스 메서드
static이 붙어있으면 클래스 메서드이고 아니면 인스턴스 메서드이다. 클래스 메서드 또한 객체를 생성하지 않고 클래스.메서드()로 직접 호출할 수 있다. 인스턴스 메서드는 인스턴스를 생성해야만 호출할 수 있다.
메서드 중 인스턴스와 상관없이 사용할 메서드를 클래스 메서드로 정의한다.
코드예제
public class StaticInstanceEx {
public static void main(String[] args) {
// 인스턴스 메서드는 인스턴스 생성 후 사용 가능
Calculator1 instance = new Calculator1();
int val = instance.instanceAdd();
System.out.println("val = " + val);
// 클래스 메서드는 인스턴스 없이 바로 사용가능
int val2 = Calculator1.classAdd(3, 5);
System.out.println("val2 = " + val2);
}
}
class Calculator1 {
// 인스턴스 변수
int x = 10, y = 10;
// 인스턴스 메서드
int instanceAdd() {
return x + y;
}
// 클래스 메서드
static int classAdd(int a, int b) {
return a + b;
}
}
클래스 맴버와 인스턴스 맴버 호출
같은 클래스에 속한 멤버들 간에는 별도의 인스턴스 생성 없이도 서로 참조나 호출이 가능하다.
하지만, 클래스 메서드는 인스턴스변수나 인스턴스 메서드를 사용할 수 없다. 클래스 메서드 호출 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.
반면 인스턴스변수나, 인스턴스 메서드에서는 static이 붙은 멤버를 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.
코드예제
클래스 메서드 내에서 인스턴스 멤버를 사용하기 위해서는 인스턴스를 생성한 이후에만 가능하다.
코드예제
// 클래스 메서드
static int classAdd(int a, int b) {
// System.out.println("x = " + x); // 인스턴스 변수 호출 불가능
// instanceAdd() // 인스턴스 메서드 호출 불가능
// 호출후에만 가능
Calculator1 calculator1 = new Calculator1();
int x = calculator1.x;
calculator1.instanceAdd();
return a + b;
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 생성자란? (0) | 2022.06.22 |
---|---|
[Java] 오버로딩이란? (0) | 2022.06.22 |
[Java] 클래스와 객체 (0) | 2022.06.22 |
[Java] 배열(Array) (0) | 2022.06.21 |
[Java] 자바 연산자(Java Operator) (0) | 2022.06.20 |