[스터디]Java의 정석 9일차

Kristopher·2022년 1월 4일
0

Java 스터디

목록 보기
9/31

(CH6) 3.7 JVM 메모리 구조 ~ 4.5 가변인자와 오버로딩

JVM 구성요소

JVM은 크게 3가지 영역으로 나뉜다. 클래스 데이터(ex. 클래스 변수)를 다루는 Method Area, 인스턴스가 생성되는 공간인 Heap, 메소드 작업에 필요한 메모리 공간을 제공하는 Call Stack/Execution Stack으로 구성된다.

매개변수의 종류

메소드를 호출할 때 매개변수로 지정한 값을 복사하여 넘겨준다. 이때 기본형 매개변수와 참조형 매개변수 두가지로 구분될 수 있는데, 기본형 매개변수는 기본값이 복사되기 때문에 단순 읽기 작업만 가능하지만, 참조형 매개변수는 인스턴스의 주소가 복사되기 때문에 값을 읽고 변경할 수 있다.

참조형 반환 타입

지금까지 메소드의 return 값은 기본형만 사용하였다. 하지만 return 값도 참조형으로 반환할 수 있다. 참조형을 반환한다는 것은 하나의 값이 아니라 객체의 주소를 반환한다는 것을 의미한다.

재귀호출 방법

재귀(recursive)란 '본래의 장소로 다시 돌아온다'는 뜻이다. 그렇기에 재귀 호출이란, 메소드 안에 같은 메소드를 넣어 자기 자신을 호출하도록 하는 것이다. 사실 이 작업은 반복문을 통해서도 처리가 가능하지만, 논리적 간결함이나 반복횟수를 신경쓰지 않아도 된다는 점이 장점이다. 다만 예상치 못하게 예외처리가 발생하여 스택의 저장한계가 넘게되어 StackOverFlow가 발생하는 경우가 있다. 그렇기에 재귀호출을 사용할 때는 이와같은 현상이 발생하지 않도록 주의해야 한다.

메소드의 종류

변수에도 여러가지 종류가 있듯이 메소드에도 종류가 있다. 메소드는 클래스 메소드와 인스턴스 메소드로 나뉘는데 변수와 나뉘는 기준이 유사하다. 인스턴스 메소드는 인스턴스 변수를 활용하여 작업을 실행하는 경우이다. 그 외에 인스턴스 변수나 인스턴스 메소드를 사용하지 않는 모든 변수를 클래스 메소드로 정의한다. 클래스 메소드 앞에는 static을 붙여 구분한다.

클래스멤버와 인스턴스멤버를 사용할 때 주의해야할 점이 있다. 클래스 멤버는 호출되지 않아도 메모리에 존재하기 때문에 항상 존재하지만 인스턴스멤버는 인스턴스가 생성되지 않으면 존재하지 않기 때문이다. 그렇기에 클래스 메소드 내에서는 인스턴스 변수를 사용할 수 없다.

오버로딩

기본적으로 하나의 클래스 내에 있는 메소드들의 이름은 다른 이름을 가져야 한다. 하지만 자바에서는 이 규칙이 위배되는 경우가 있는데 이를 오버로딩이라고 한다. 오버로딩의 조건은 두가지가 있다.

  1. 한 클래스내에서 메소드의 이름이 서로 같아야 한다.
  2. 각 메소드가 받는 매개변수의 개수 혹은 타입이 달라야 한다.

위 두가지 조건을 만족시킨다면 해당 클래스가 오버로딩 되어있다고 판단한다. 앞의 예제에서 지속적으로 사용한 println이 대표적인 오버로딩의 예시이다. 겉보기엔 같은 메소드를 불러온 것 같았지만 프린트하는 변수의 타입에 따라 다른 메소드가 호출되고 있었던 것이다.

오버로딩을 사용하는 이유는 어디까지나 편의성 때문이다. 프로그래밍을 하는 사람은 여러 이름을 고민해야할 필요가 없으니 편리하고, 사용자 입장에서는 여러가지 메소드를 다르게 기억할 필요가없으니 편리한 것이다.

가변인자의 개념

메소드를 정의할 때 매개변수의 개수가 몇개나 필요할지 불명확한 순간이 존재한다. 이런경우에 가변인자를 사용하여 매개변수를 받을 수 있는데, 말 그대로 유동적인 인자를 의미한다.

// 가변인자는 '타입... 변수명'으로 선언한다.
public Print_All printf(String format, Object... args){...}

가변인자를 사용할 때 주의할 점은 오버로딩과 맞물린다. 오버로딩의 조건에서 각 메소드의 이름이 같더라도 매개변수의 개수가 다른 경우는 허용되었는데, 가변인자의 경우 몇개의 변수가 들어올지 모르기 때문에 두 메소드의 이름이 같고 겉보기에 매개변수의 개수가 다르더라도 컴파일에러가 발생할 수 있다.

Reference

Java의 정석
남궁성의 정석코딩

profile
개발자 지망생입니다.

1개의 댓글

comment-user-thumbnail
2022년 1월 8일

비밀 댓글입니다.

답글 달기