[Java] First-class Object, 일급 객체
📌 일급 객체란?
First-class Object , 일급 객체는 사실 자바에서만 사용되는 표현은 아니다. 일급 객체란 다른 객체들에 대해 일반적으로 적용 가능한 모든 연산을 지원하는 객체를 말하며, 보통 함수형 프로그래밍의 핵심 개념으로 여겨진다. 대표적으로 JavaScript, Python이 일급 객체 언어이며, C, C++ 등은 그렇지 않다.
자바는 Java 7 이전에는 Object 는 일급 객체였으나, 메서드는 그렇지 않았다. 일단 어떤 기준으로 일급 객체인지 판단하는지 살펴보자.
📌 일급 객체가 되기 위한 조건
모든 클래스는 Object 를 상속받는다. User 라는 클래스가 있다고 가정하자.
변수나 데이터 구조에 저장할 수 있어야 한다
변수나 데이터 구조에 담을 수 있다는 것은, 객체를 메모리에 생성하고 해당 메모리 위치를 가리키는 참조 값을 저장한다는 것이다.
1
2
3
4
User user1 = new User("chosh");
User[] users = new User[2];
users[0] = user1;
생성자를 통해 User 객체를 생성하면 해당 객체는 메모리의 Heap 영역에 생성된다. user1 이라는 변수는 생성된 객체의 메모리 주소를 참조하게 된다. 즉, 객체는 변수에 자유롭게 할당할 수 있다.
메서드의 파라미터로 전달할 수 있어야 한다
1
2
3
public static void printUser(User user) {
System.out.println("사용자: " + user);
}
printUser(user1) 을 호출할 때, user1 이 가리키는 User 객체의 참조 값이 메서드로 복사되어 전달된다. 이를 통해 메서드는 전달받은 객체에 접근할 수 있다.
메서드의 리턴 값으로 사용할 수 있어야 한다
1
2
3
public static User createUser(String name) {
return new User(name);
}
createUser 메서드는 내부적으로 새로운 User 객체를 생성한 뒤 객체의 참조 값을 리턴한다.
📌 자바에서 일급 객체
Java 7 이전에는 메서드는 일급 객체가 아니었다. 즉, 메서드를 변수에 할당할 수 없었고, 다른 메서드의 인자로 넘길 수 없었으며 메서드에서 메서드를 리턴할 수 없었다. 따라서 메서드를 리턴하고 싶을 때 메서드를 포함하는 객체로 감싸는 방법을 사용했는데, 이것이 ‘익명 내부 클래스’이다.
그러나 Java 8부터 람다 표현식과 함수형 인터페이스가 도입되면서 메서드를 일급 객체처럼 다룰 수 있게 되었다. 정확히 표현하면 메서드 자체가 일급 객체가 된 것이 아니라, 내부적으로 익명 객체로 변환되지만 마치 람다 표현식을 일급 객체인 양 사용할 수 있게 된 것이다.