Home [Java] 변수와 메서드
Post
Cancel

[Java] 변수와 메서드

변수

변수의 종류

  1. 클래스변수 (class variable)
    • 선언 방법 : 클래스 영역에 선언하고 변수 앞에 static을 붙인다.
    • 사용 방법 : 클래스이름.클래스변수
    • 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
    • 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지된다.
    • public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 전역변수의 성격을 갖는다.
  2. 인스턴스변수 (instance variable)
    • 선언 방법 : 클래스 영역에 선언한다.
    • 사용 방법 : 클래스의 인스턴스 생성 후 클래스인스턴스.인스턴스변수
  3. 지역변수 (local variable)
    • 선언 방법 : 클래스 영역 이외의 영역(메서드 등)에서 선언한다.
    • 지역변수가 선언된 블럭{} 내에서만 사용 가능하다.
변수의 종류선언 위치생성시기
클래스변수클래스 영역클래스가 메모리에 올라갈 때
인스턴스변수클래스 영역인스턴스가 생성되었을 때
지역변수클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때
1
2
3
4
5
6
7
8
class Variables {
  int iv;			// 인스턴스변수
  static int cv;	// 클래스변수
  
  void method() {
    int lv = 0;		// 지역변수
  }
}

메서드

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

메서드의 선언과 구현

메서드 = 선언부 + 구현부

object

메서드 선언부(method declaration, method header)

메서드 선언부 = 반환타입 + 메서드이름 + 매개변수선언

  1. 매개변수 선언(parameter declaration)
    • 메서드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것
    • , (쉼표)를 통해 구분한다.
    • 일반적인 변수 선언과 달리 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.
  2. 메서드 이름(method name)
    • 메서드의 기능을 쉽게 알 수 있도록 의미있는 이름을 짓도록 노력해야 한다.
  3. 반환타입(return type)
    • 메서드의 작업수행 결과(출력)인 ‘반환값(return value)’의 타입을 적는다.
    • 반환값이 없는 경우 void를 적어야 한다.

메서드 구현부(method body, 메서드 몸통)

메서드를 호출했을 때 수행될 문장들을 넣는다.

  1. return문
    • 메서드의 반환타입이 void가 아닌 경우 반드시 포함되어야 한다. (void인 경우 컴파일러가 자동으로 return;을 추가해준다.)
    • 반환값은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
    • 단 하나의 값만 반환할 수 있다.
  2. 지역변수
    • 메서드 내에 선언된 변수

메서드의 호출

1
메서드이름(값1, 값2, ...)

인자(argument, 인수)

  • 메서드를 호출할 때 괄호() 안에 지정해준 값들
  • 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
  • 인자의 타입은 매개변수와 타입이 일치하거나 자동 형변환이 가능한 것이어야 한다.

매개변수와 반환값의 타입

매개변수와 반환값이 기본형일 때는 기본형의 이 복사되고, 참조형일 때는 인스턴스의 주소가 복사된다.

👉 주소를 넘겨주면 값을 읽어오는 것뿐만 아니라 변경하는 것도 가능하다.

👉 메서드는 단 하나의 값만을 반환할 수 있지만 이것을 응용하여 여러 개의 값을 반환하는 것과 같은 효과를 얻을 수 있다.

+) Java에서는 매개변수로 값 또는 주소값이 넘어가는 것이기 때문에 Call by value이다.

오버로딩

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

  • 오버로딩을 통해 같은 이름의 메서드들이 같은 기능을 할 것이라고 예측하도록 할 수 있다.

선언 조건

  1. 메서드의 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.

반환타입은 오버로딩을 구현하는 데 아무런 영향을 주지 못한다.

1
2
int add(int a, int b) {return a + b;}
long add(long a, long b) {return a + b;}

가변인자(varargs) 사용

메서드의 매개변수 개수를 동적으로 지정하는 것 (JDK1.5 이상)

1
2
3
4
5
6
7
8
9
10
11
12
String concatenate(String s1, String s2) { ... }
String concatenate(String s1, String s2, String s3) { ... }

// 가변인자를 사용해서 메서드 하나로 대체
String concatenate(String... args) {
  String result = "";
  
  for(String str : args) {
    result += str;
  }
  return result;
}
  • 선언 방법 : 타입... 변수명 매개변수 중에서 가장 마지막에 선언해야 한다.

  • 호출 방법 : 인자가 아예 없어도 되고, 배열도 인자가 될 수 있다.

    1
    2
    3
    
    concatenate();		// 인자가 없음
    concatenate("A");	// 인자가 하나
    concatenate(new String[]{"A", "B"});	// 배열도 가능
    
  • 가변인자를 선언한 메서드를 오버로딩할 경우 : 메서드가 구분되지 않는 경우에 발생하여 컴파일 에러

생성자(Constructor)

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

선언 조건

  1. 생성자 이름이 클래스 이름과 같아야한다.
  2. 생성자는 리턴값이 없다.

오버로딩이 가능하다.

1
2
3
4
클래스이름(타입 변수명, 타입 변수명, ...) {
  // 인스턴스 생성 시 수행될 코드
  // 주로 인스턴스 변수의 초기화 코드를 적는다.
}

수행과정

1
Card c = new Card();
  1. 연산자 new에 의해 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
  2. 생성자 Card()가 호출되어 수행된다.
  3. 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

기본 생성자(default constructor)

클래스에 정의된 생성자가 하나도 없을 때에만 컴파일러는 기본 생성자를 추가한다.

this, this()

this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스의 주소가 저장되어 있다.
  • 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.

this(), this(매개변수)

  • 생성자
  • 같은 클래스의 다른 생성자를 호출할 때 사용한다.

변수의 초기화

변수를 선언하고 처음으로 값을 지정하는 것

  • 멤버변수는 초기화하지 않아도 자동적으로 번수의 자료형에 맞는 기본값으로 초기화가 이루어진다.
  • 지역변수는 사용하기 전에 반드시 초기화해야 한다.

멤버변수의 초기화 방법

  1. 명시적 초기화
  2. 생성자
  3. 초기화 블럭
    • 인스턴스 초기화 블럭
    • 클래스 초기화 블럭

명시적 초기화

변수를 선언과 동시에 초기화하는 것

1
2
3
4
class Car {
  int door = 4;				// 기본형 변수의 초기화
  Engine e = new Engine();	// 참조형 변수의 초기화
}

초기화블럭

  1. 인스턴스 초기화 블럭
    • 인스턴스 변수의 복잡한 초기화에 사용된다.
    • 작성 방법 : 클래스 내에 {}블럭을 만든다.
    • 수행 시기 : 인스턴스를 생성할 때 (생성자보다 인스턴스 초기화 블럭이 먼저 수행된다.)
  2. 클래스 초기화 블럭
    • 클래스 변수의 복잡한 초기화에 사용된다.
    • 작성 방법 : 클래스 내에 static{}블럭을 만든다.
    • 수행 시기 : 클래스가 메모리에 처음 로딩될 때 한번만
1
2
3
4
5
6
7
8
9
10
11
class InitBlock {
  static {
    // 클래스 초기화 블럭
  }
  
  {
    // 인스턴스 초기화 블럭
    count++;
    serialNo = count;
  }
}

멤버변수의 초기화 시기와 순서

클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화된다.

인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화된다.

클래스 변수의 초기화 순서 : 기본값 👉 명시적초기화 👉 클래스 초기화 블럭

인스턴스 변수의 초기화 순서 : 기본값 👉 명시적초기화 👉 인스턴스 초기화 블럭 👉 생성자

출처📎

  • 자바의 정석
This post is licensed under CC BY 4.0 by the author.