본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
Ch 2. 객체지향 시작하기
자바 메소드의 이해: 재사용 가능한 코드 블록 만들기
자바 프로그래밍의 핵심 요소 중 하나인 메소드(Method)에 대해 깊이 있게 다뤄보겠습니다. 메소드를 이해하는 것은 효율적이고 재사용 가능한 코드를 작성하는 데 필수적입니다.
1. 함수와 메소드: 무엇이 다를까요?
컴퓨터 프로그래밍에서 함수(Function)는 특정 작업을 수행하는 호출 가능한 소프트웨어 로직 단위(callable unit of software logic)입니다. 함수는 잘 정의된 인터페이스와 동작을 가지며 여러 번 호출될 수 있습니다.
자바는 객체 지향 프로그래밍 언어이기 때문에, C나 C++에서 '함수'라고 부르는 것을 '메소드'라고 지칭합니다. 즉, 자바에서 메소드는 객체와 연관된 절차(procedure associated with an object)이며, 일반적으로 메시지와도 관련이 있습니다. 메소드는 사용자에게 매개변수화된 객체의 동작(behavior of an object parametrized by a user)이라고 할 수 있습니다.
간단히 말해, 자바에서는 객체(클래스의 인스턴스)의 일부로 정의된 함수를 메소드라고 생각하면 됩니다. 모든 자바 코드는 클래스 내부에 존재해야 하며, 메소드는 이 클래스 내에서 특정 기능을 수행하는 역할을 합니다.
2. 메소드의 정의와 작성: 첫 번째 메소드 만들기
메소드를 작성하는 것은 프로그램을 모듈화하고 관리하기 쉽게 만드는 중요한 단계입니다. 자바 프로그램의 시작점은 항상 main 메소드입니다. 이 main 메소드 안에서 다른 메소드를 호출하여 다양한 기능을 수행할 수 있습니다.
쇼핑몰에서 '주문' 행위를 흉내 낸 간단한 프로그램을 통해 메소드를 만들어 봅시다.
첫 번째 메소드 예제:
public class Shopping {
public static void main(String[] args) { // 프로그램의 시작점
// 상품 주문 행위
order(); // order 메소드 호출
}
// 주문 행위를 수행하는 메소드 정의
public static void order() {
System.out.println("상품이 주문되었습니다.");
}
}
이 코드에서 order()는 우리가 직접 정의한 메소드입니다. main 메소드에서 order()를 호출하면 "상품이 주문되었습니다."라는 메시지가 출력됩니다.
2.1. 메소드 개선하기: 가독성 향상
코드는 한 번 작성하고 끝나는 것이 아니라, 다른 사람과 협업하거나 나중에 다시 보게 될 경우가 많습니다. 이때 코드의 가독성은 매우 중요하죠. 메소드 내의 변수 이름을 의미 있는 이름으로 바꾸는 것은 좋은 습관입니다.
개선된 메소드 예제 (변수 이름 변경):
public class Shopping {
public static void main(String[] args) {
// String pName = "노트북"; // 이전의 의미 없는 변수 이름 (예시)
String productName = "노트북"; // 의미 있는 변수 이름으로 변경
int productPrice = 1200000;
order(productName, productPrice); // 메소드 호출 시 상품명과 가격 전달
}
// 상품명과 가격을 매개변수로 받는 order 메소드
public static void order(String name, int price) { // 매개 변수(parameter)는 데이터 전달 역할 [cite: 480, 485]
System.out.println(name + " 상품이 주문되었습니다. 가격: " + price + "원");
}
}
이제 order 메소드는 어떤 상품이 얼마에 주문되었는지 더 명확하게 보여줍니다. 여기서 name과 price는 매개변수(parameter)라고 합니다. 매개변수는 서브루틴에 입력으로 제공되는 데이터 조각을 참조하는 데 사용되는 특별한 종류의 변수입니다. 메소드를 호출할 때 매개변수에 전달되는 실제 값을 인수(argument)라고 합니다.
2.2. 두 번째 메소드 개선: 기능 추가 및 출력 형식 변경
이번에는 고객의 전화번호를 받아서 계좌 이체를 유도하고 금액을 확인한 후에 상품을 보내는 시나리오를 추가해 봅시다. 또한, 상품 판매를 할 사람이 보기 좋게 출력문을 변경하여 정보를 더 명확하게 전달합니다.
더 개선된 메소드 예제 (전화번호 추가):
import java.util.Scanner; // 사용자 입력을 받기 위해 Scanner 클래스 임포트
public class Shopping {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
System.out.print("고객님, 전화번호를 입력해주세요: ");
String phoneNumber = scanner.nextLine(); // 사용자로부터 전화번호 입력받기 [cite: 435]
String productName = "무선 이어폰";
int productPrice = 150000;
order(phoneNumber, productName, productPrice); // 전화번호, 상품명, 가격 전달
scanner.close(); // Scanner 닫기
}
// 전화번호, 상품명, 가격을 매개변수로 받는 order 메소드
public static void order(String number, String name, int price) {
System.out.println("--- 주문 정보 ---");
System.out.println("고객 전화번호: " + number); // [cite: 435]
System.out.println("상품명: " + name);
System.out.println("가격: " + price + "원");
System.out.println("계좌 이체 후 상품이 배송될 예정입니다. 감사합니다!"); //
}
}
이 코드는 사용자로부터 전화번호를 입력받아 주문 정보와 함께 출력합니다.
3. 메소드 오버로딩 (Method Overloading): 동일한 이름, 다른 기능
간혹 이름은 같지만 기능이 조금 다른 메소드가 필요할 때가 있습니다. 예를 들어, 어떤 고객은 개인 정보를 숨기고 싶어 할 수 있습니다. 이럴 때 메소드 오버로딩(Method Overloading) 기능을 사용하면 유용합니다.
메소드 오버로딩은 동일한 이름의 여러 함수를 다른 구현으로 만들 수 있는 능력입니다. 자바에서는 메소드 시그니처(Method Signature)를 통해 오버로드된 메소드들을 구별합니다. 메소드 시그니처는 일반적으로 메소드 이름과 매개변수의 수, 타입, 순서를 포함합니다.
메소드 오버로딩 예제:
public class Shopping {
public static void main(String[] args) {
// 일반 고객 주문
order("010-1234-5678", "스마트워치", 300000);
// 익명 고객 주문 (전화번호만 받음)
order("010-9876-5432");
}
// 1. 모든 정보를 받는 order 메소드
public static void order(String phoneNumber, String productName, int price) {
System.out.println("--- 고객 주문 (정식) ---");
System.out.println("전화번호: " + phoneNumber);
System.out.println("상품명: " + productName);
System.out.println("가격: " + price + "원");
System.out.println("주문이 완료되었습니다.");
}
// 2. 전화번호만 받는 order 메소드 (오버로딩)
public static void order(String phoneNumber) {
System.out.println("--- 익명 고객 주문 ---");
System.out.println("전화번호: " + phoneNumber);
System.out.println("익명으로 상품이 주문되었습니다.");
}
}
위 코드에서 order라는 이름의 메소드는 두 개입니다. 하나는 전화번호, 상품명, 가격을 매개변수로 받고, 다른 하나는 전화번호만 받습니다. 이렇게 매개변수의 개수나 타입이 다르면 같은 이름의 메소드를 여러 개 만들 수 있습니다.
4. 변수와 데이터의 공유 범위: 스코프(Scope)와 멤버 변수
메소드를 작성하다 보면 메소드 간에 데이터를 공유해야 할 필요가 생깁니다. 이때 중요한 것이 변수의 범위(Scope) 개념입니다.
로컬 변수(Local Variable)는 메소드 안에서 선언된 변수로, 해당 메소드 안에서만 유효합니다. 메소드가 실행되는 동안에만 존재하며, 메소드 실행이 끝나면 소멸됩니다.
반면, 멤버 변수(Member Variable)는 클래스 내부에 선언되며, 클래스에 속한 모든 메소드들이 공유할 수 있습니다. 멤버 변수는 객체가 생성될 때 존재하며, 객체가 소멸될 때까지 유지됩니다.
메소드 사이의 데이터 공유 예제 (주문 개수 세기):
현재까지 주문된 개수를 알고 싶다면 어떻게 해야 할까요? 로컬 변수는 메소드 안에서만 유효하기 때문에, 여러 메소드에서 공유하려면 멤버 변수를 사용해야 합니다.
public class Shopping {
// 멤버 변수: 모든 메소드가 공유할 수 있는 주문 개수 [cite: 471, 477]
private static int numberOfOrders = 0;
public static void main(String[] args) {
order("010-1111-2222", "키보드", 80000);
order("010-3333-4444"); // 익명 주문
order("010-5555-6666", "마우스", 30000);
System.out.println("\n총 주문 개수: " + numberOfOrders); // 총 주문 개수 출력
}
// 모든 정보를 받는 order 메소드
public static void order(String phoneNumber, String productName, int price) {
System.out.println("--- 고객 주문 (정식) ---");
System.out.println("전화번호: " + phoneNumber);
System.out.println("상품명: " + productName);
System.out.println("가격: " + price + "원");
numberOfOrders++; // 주문 발생 시 총 주문 개수 증가
System.out.println("현재까지 주문 개수: " + numberOfOrders);
}
// 전화번호만 받는 order 메소드 (오버로딩)
public static void order(String phoneNumber) {
System.out.println("--- 익명 고객 주문 ---");
System.out.println("전화번호: " + phoneNumber);
numberOfOrders++; // 주문 발생 시 총 주문 개수 증가
System.out.println("현재까지 주문 개수: " + numberOfOrders);
}
}
여기서 numberOfOrders는 private static int로 선언된 멤버 변수입니다. 이렇게 선언하면 Shopping 클래스 내의 모든 order 메소드가 이 변수를 공유하고 접근하여 값을 변경할 수 있게 됩니다.
오늘의 실습
오늘의 느낀점
예전에 자바 공부 처음했을때 오버로딩과 오버라이딩을 구분 잘 하라고 했는데, 오랜만에 보니 감회가 새롭다. 강의 목록을 보니 내일 공부할 분량에서 오버라이딩이 나오는데, 다시 한번 잘 정리 해 놔야겠다.
https://fastcampus.info/4n8ztzq
(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스
초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!
fastcampus.co.kr
'개발공부 > Java' 카테고리의 다른 글
패스트캠퍼스 환급챌린지 21일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (2) | 2025.07.21 |
---|---|
패스트캠퍼스 환급챌린지 20일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.20 |
패스트캠퍼스 환급챌린지 19일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.19 |
패스트캠퍼스 환급챌린지 18일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.18 |
패스트캠퍼스 환급챌린지 16일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.16 |