함수 vs 메서드
자바에서 함수(function)는 일반적으로 정적 메서드(static method)와 같은 의미로 사용된다. 또 일반적으로 함수는 특정 클래스에 속하지 않고 전역적으로 호출될 수 있다. 하지만 메서드는 보통 특정 클래스에 선언되기에 종속적이다.
즉, 함수는 전역적으로 사용될 수 있는 독립적인 존재, 메서드는 클래스와 같은 구조체에 종속적인 존재다.
아래의 코드를 통해 확인해보자.
public class FirstClass {
public static void callFunction() {
System.out.println("함수");
}
}
public class SecondClass {
public void callMethod() {
System.out.println("메서드");
}
}
public class Main {
public static void main(String[] args) {
SecondClass second = new SecondClass();
FirstClass.callFunction();
second.callMethod();
}
}
// 출력결과
함수
메서드
함수는 callFunction과 같이 클래스를 인스턴스로 만들지 않고도 사용할 수 있다. 하지만 callMethod는 클래스를 반드시 인스턴스에 객체 참조를 해야만 사용할 수 있다.
정리를 해보자.
구분 | 함수(function) | 메서드(method) |
특징 | - 독립적인 존재(static method) | -- 구조체에 종속적인 존재 |
일급 객체와 일급 함수
일급 객체는 일급 시민, 일급 값 등으로 불리기도 하며 일급 함수라는 개념도 존재한다.
먼저 이들의 차이에 대해 알아보자.
1960년대 처음으로 일급 객체에 대한 개념이 등장했다. 일급 객체가 되기 위한 몇 가지 조건이 있다.
- 모든 요소는 함수의 실제 매개변수가 될 수 있다.
- 모든 요소는 함수의 반환 값이 될 수 있다.
- 모든 요소는 할당 명령문의 대상이 될 수 있다.
- 모든 요소는 동일 비교의 대상이 될 수 있다.
위의 조건들을 충족하는 것들은 Java에서 Primitive Type(int, double 등), Reference Type(String, Integer 및 인스턴스 등)이 있다. 여기서 주의할 점은 클래스는 일급이 아닌 이급 객체이고 클래스(객체)를 참조하는 인스턴스가 일급 객체라는 점이다. 일급 객체가 일반적으로 통용되는 단어이며 종종 일급 시민, 일급 값으로도 불리는 듯 하다.
이러한 조건들이 함수에 적용되면 일급 함수라고 불리게 된다. 즉, 함수가 매개변수로 전달(동작 파라미터화)될 수 있고, 함수가 반환 값이 될 수 있으며, 함수는 변수에 할당 될 수 있다. 그렇기 때문에 함수는 동일 비교의 대상이 될 수 있다.
일급 함수를 가진 대표적인 언어 Javascript의 코드를 예제로 살펴보자.
1. 함수는 함수의 실제 매개변수가 될 수 있다.
const printHello = function () {
console.log("Hello");
}
function functionCall(function) {
function();
}
functionCall(printHello);
2. 함수는 함수의 반환 값이 될 수 있다.
function functionReturn () {
console.log("함수를 리턴 해보자");
return function() {
alter("함수가 리턴됐다!");
}
}
3. 함수는 할당 명령문의 대상이 될 수 있다.
const printHello = function () {
console.log("Hello");
}
printHello();
앞선 설명을 통해 일급 객체와 일급 함수가 무엇인지 알아보았다.
여담으로 일급 컬렉션(First Class Collection)이라는 것도 존재한다. 다만 같은 일급(First Class)라고 해서 의미하는 바가 비슷한 것은 아니다. 자세한 내용은 아래의 링크를 참조하자.
https://jojoldu.tistory.com/412
일급 컬렉션 (First Class Collection)의 소개와 써야할 이유
최근 클린코드 & TDD 강의의 리뷰어로 참가하면서 많은 분들이 공통적으로 어려워 하는 개념 한가지를 발견하게 되었습니다. 바로 일급 컬렉션인데요. 왜 객체지향적으로, 리팩토링하기 쉬운 코
jojoldu.tistory.com
Java에서의 일급 함수
Java8이전엔 자바의 메서드는 일급 객체가 아닌 이급 객체였다. 하지만 Java8에서 람다, 익명클래스, 메서드 참조를 통해 자바의 메서드가 일급 객체의 역할을 수행할 수 있게 됐다. 또한 람다를 포함하여 함수도 값으로 취급할 수 있게 됐다.
프로그래밍 패러다임 중 '객체 지향 프로그래밍'과 '함수형 프로그래밍'라는 것이 존재 한다. 두 패러다임은 상호 보완적인 관계보단 상충하는 개념에 가까웠다. 하지만 두 개의 패러다임 중 어느 것이 좋은지는 의미가 없다. 각각이 갖는 장점이 명확했기 때문이다. 유지보수의 강력함을 가지는 객체 지향 패러다임, 안전성과 함수의 재활용의 강력함을 가지는 함수형 패러다임. 그렇기 때문에 각 패러다임이 프로그래밍 시장에서 사용되는 부분은 명확했다.
이러한 분위기 속에서 고전적인 객체 지향 언어가 가지는 한계를 극복하고 프로그래밍 시장에서 Java라는 언어가 가지는 파이를 넓히기 위해 Java8이 탄생했다. Java8 버전에 대한 도서, 강의 등이 따로 존재할 정도로 굉장히 큰 변화였고 각 패러다임의 장점을 잘 살려 사용성을 높였다.
참고 :
모던 자바 인 액션
https://ko.wikipedia.org/wiki/%EC%9D%BC%EA%B8%89_%EA%B0%9D%EC%B2%B4
일급 객체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 컴퓨터 프로그래밍 언어 디자인에서, 일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통
ko.wikipedia.org
👨💻 일급 객체(first-class object) 란?
일급 객체 란? 보통 자바의 람다 표현식(Lambda Expression)을 배우다 보면 '일급 객체' 라는 단어를 접하게 되는데, 뜻을 아무리 봐도 대체 무얼 말하는 건지 와닿지 않을 것이다. '일급' 이란 뜻은 일
inpa.tistory.com
'Java' 카테고리의 다른 글
Java - List의 제네릭 타입이 달라도 오버로딩은 불가하다. (0) | 2023.10.03 |
---|---|
Java - List vs Map (0) | 2023.09.21 |
Java - 서블릿과 서블릿 컨테이너 (0) | 2023.07.08 |
Java - 얕은 복사 vs 깊은 복사(shallow copy vs deep copy) (0) | 2022.12.07 |
String vs StringBuffer vs Stringbuilder (0) | 2022.11.01 |