본문 바로가기
Language/Java

5분 안에 자바(Java) 소스 코드 구조 알아보기

by 도뎡 2023. 7. 8.
반응형

자바(Java)를 시작하기 전에

자바로 프로그래밍을 시작하려면 JDK(Java Development Kit)라는 개발 도구가 필요하며, 운영체제(OS)에 JDK를 설치하면 자바 가상 머신(JVM)과 자바 개발에 필요한 프로그램들이 설치됩니다.

제 블로그의 스프링 부트(Spring Boot) - 게시판 개발환경 설정하기에서 1번부터 5번까지 진행하시면 자바 프로그래밍 준비를 마치실 수 있으니, 개발환경 세팅이 필요하시다면 참고해 주세요 :)

 

1. 자바(Java) 소스 파일 구조

자바에서 모든 소스 코드는 Class(이하 "클래스") 안에 작성해야 합니다. 그리고, 하나의 자바 프로그램(애플리케이션)은 여러 클래스의 집합으로 이루어져 있습니다.

아래 코드는 일반적인 클래스의 구조입니다.

// 1. package(패키지) 선언
package com.company;

// 2. import(참조) 선언
import java.lang.String;

// 3. 클래스 선언
public class Member {

    // 4. main 메서드 선언
    public static void main(String[] args) {
        String message = hello(30, "1번 회원");
        System.out.println(message);
        System.out.println(hello(27, "2번 회원"));
    }

    // 5. hello 메서드 선언
    public static String hello(int age, String name) {
        return age + "살" + name + " 님 만나서 반갑습니다!";
    }

}

 

1-1. package(패키지) 문 선언

패키지는 클래스가 위치한 경로를 의미하며, 하나의 패키지 안에는 여러 개의 클래스가 포함될 수 있습니다. 서로 연관된 클래스들을 패키지 단위로 묶으면, 클래스를 더욱 효율적으로 관리할 수 있습니다.

 

  • 패키지는 자바 소스 파일의 최상단에 선언해야 하며, 단 한 번만 선언할 수 있습니다.
  • 패키지명은 영어 대소문자를 모두 사용할 수 있으나, 현업에서는 영어 소문자만으로 구성하는 것을 권장합니다.
  • 동일한 이름의 클래스가 여러 개 존재하는 경우, 패키지를 기준으로 클래스를 구분할 수 있습니다.
  • 패키지는 운영체제(OS)의 폴더(디렉터리)와 같이 물리적인 경로를 의미하며, 패키지 선언에 포함되는 dot(.)은 OS에서 폴더 경로를 구분하는 (\ 또는 /)와 동일합니다.

 

1-2. import(참조) 문 선언

import는 특정 클래스에서 다른 클래스를 참조(사용)하고 싶을 때 선언하는 키워드입니다. 만약 자바에서 import를 사용할 수 없었다면, 아래 코드의 String 클래스와 같이 클래스의 전체 경로(패키지 + 클래스명)를 입력해야 했을 것입니다.

package com.company;

public class Member {

    public static void main(String[] args) {
        java.lang.String message = hello(30, "1번 회원");
        System.out.println(message);
        System.out.println(hello(27, "2번 회원"));
    }

    public static java.lang.String hello(int age, java.lang.String name) {
        return age + "살" + name + " 님 만나서 반갑습니다!";
    }

}

String 클래스는 "문자열" 처리를 위한 java.lang 패키지에 포함된 클래스로, 클래스 내에서 따로 import 하지 않아도 사용할 수 있습니다.


  • import 문의 메인 역할은, 소스 파일에서 사용된 클래스의 패키지 정보를 컴파일러에게 제공하는 것입니다.
  • import 문은 package 문 뒤에 선언해야 하며, pacakge와는 달리 여러 번 선언할 수 있습니다.
  • import 문의 끝에 클래스명이 아닌 Asterisk(*)를 선언하면, 패키지 내에 포함된 모든 클래스를 패키지명 없이 사용할 수 있습니다.
  • import 문은 프로그램 실행에는 성능상의 영향이 전혀 없으며, 컴파일 시간이 조금 더 걸리는 게 전부입니다.
package com.company;

// java.time 패키지의 모든 클래스 참조 (하위 패키지(디렉터리) 제외)
import java.time.*;

// 앞에서 java.time.*을 선언했지만, java.time.format은 java.time의 하위 패키지이므로 별도로 선언해 주어야 함
import java.time.format.DateTimeFormatter;

public class Time {

    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String message = "현재 시간은 " + LocalDateTime.now().format(formatter).toString() + "입니다.";
        System.out.println(message);
    }

}

 

1-3. 클래스 선언

클래스는 쉽게 말해, 객체(Object)를 정의해 둔 설계도로 생각할 수 있습니다. 여기서 말하는 객체는 우리가 일상에서 흔히 눈으로 볼 수 있는 물리적인 사물일 수도 있고, 형태가 없는 논리적인 개념일 수도 있습니다.

쇼핑몰 시스템을 기준으로 설명드려 보겠습니다. 기본적으로 쇼핑몰 시스템에는 다음과 같은 기능들이 필요합니다.

 

  • 상품(Goods) 관리
  • 재고(Stock) 관리
  • 회원(Member) 관리
  • 주문(Order) 관리
  • 배송(Delivery) 관리

 

이때, 상품/재고/회원/주문/배송은 자바에서 각각의 클래스로 정의되어야 하며, 객체는 각 클래스를 기준으로 생성할 수 있습니다.

클래스에 포함되는 대표적인 구성 요소들은 다음과 같습니다.

 

  • 멤버 변수(member variable) : 필드(field)라고로 표현하며, 클래스로부터 생성된 객체의 상태를 의미하는 데이터입니다. 예를 들어, 회원(Member) 클래스는 아이디, 비밀번호, 이름, 생년월일, 주소, 결제수단 등을 필드로 가질 수 있습니다.
  • 메서드(method) : 객체를 통해 실행할 기능을 의미합니다.
  • 생성자(constructor) : 객체를 생성하기 위한 메서드입니다.

 

아래 코드는 회원(Member) 클래스의 예시 코드입니다.

package com.company;

import java.time.LocalDate;

public class Member {

    String loginId;          // 로그인 ID
    String password;         // 비밀번호
    String name;             // 이름
    LocalDate birthday;      // 생년월일
    int postcode;            // 우편번호
    String address;          // 주소
    String detailAddress;    // 상세 주소
    String payMethod;        // 결제 수단

    // 기본 생성자 (다른 생성자가 없는 경우, 선언하지 않아도 됨)
    public Member() {

    }

    /*
     * 회원(Member) 객체 생성 시점에 이름을 초기화
     * ex:) Member member = new Member("도뎡");
     */
    public Member(String name) {
        // this.name은 멤버 변수 name을 의미 (필드명과 매개변수의 이름이 같은 경우 this로 구분 가능)
        this.name = name;
    }

    /*
     * 회원(Member) 객체 생성 시점에 ID와 비밀번호를 초기화
     * ex:) Member member = new Member("abc123", "qweasd123!@#");
     */
    public Member(String loginId, String password) {
        this.loginId = loginId;
        this.password = password;
    }

    // 회원의 이름을 반환
    public String getName() {
        return name; // 또는 return this.name;
    }

}

 


아래 두 개 코드는, 상품(Goods) 클래스와 상품 클래스로부터 생성된 객체에 대한 예시 코드입니다.

package com.store;

public class Goods {

    // 멤버 변수 (fields)
    public String code;     // 상품 코드
    public String name;     // 상품명
    public int size;        // 사이즈
    public int quantity;    // 수량
    public int price;       // 가격


    // 상품 정보를 출력하는 메서드
    public void printInformation() {
        System.out.println("===========================================");
        System.out.println("상품 코드는 " + code + "입니다.");
        System.out.println("상품명은 " + name + "입니다.");
        System.out.println("사이즈는 " + size + "입니다.");
        System.out.println("수량은 " + quantity + "개입니다.");
        System.out.println("가격은 " + price + "원입니다.");
        System.out.println("===========================================");
    }

    // 결제 수단을 전달받아 상품을 판매 처리하는 메서드
    public void sell(String payMethod) {
        // 카드 결제인 경우, 사용자에게 메시지를 전달한 후 로직 종료
        if ("CARD".equals(payMethod)) {
            System.out.println("===========================================");
            System.out.println("지금은 카드 결제가 불가능합니다.");
            System.out.println(name + "의 남은 수량은 " + quantity + "개입니다.");
            System.out.println("===========================================");
            return;
        }

        // 상품 수량 차감
        quantity--;

        // 낭믄 상품 수량 출력
        System.out.println("===========================================");
        System.out.println(name + "의 남은 수량은 " + quantity + "개입니다.");
        System.out.println("===========================================");

        // ... (남은 수량 저장 로직 실행)
    }

}

 

package com.test;

import com.store.Goods;

public class GoodsTest {

    // main 메서드
    public static void main(String[] args) {
        // 상품 객체 생성
        Goods shoes1 = new Goods();
        shoes1.code = "SHOES-A001";
        shoes1.name = "1번 신발";
        shoes1.size = 250;
        shoes1.quantity = 10;
        shoes1.price = 99000;

        // 상품 정보 출력
        shoes1.printInformation();

        // 상품 판매 (카드 - 결제 실패)
        shoes1.sell("CARD");

        // 상품 판매 (현금 - 결제 성공)
        shoes1.sell("CASH");
    }

}

 

GoodsTest 클래스의 main 메서드가 실행되면 아래와 같이 상품 정보와 남은 수량이 출력됩니다. 결제 수단이 카드일 땐 상품 판매가 실패 처리되고, 현금일 땐 성공 처리되는 예시 코드입니다.

shoe1 객체 - 테스트 실행 결과

 

자바 프로그램은 main 메서드의 호출로부터 시작되며, main 메서드 안의 로직이 모두 실행되면 프로그램이 종료됩니다.

main 메서드는 모든 클래스에 필요한 것은 아니지만, 프로그램 내에 main 메서드를 포함하는 클래스가 반드시 한 개는 있어야 합니다.

 

마치며

이번 글에서 포인트는 자바에서는 클래스를 통해 프로그래밍을 한다는 것과, 자바 프로그램의 시작은 main 메서드의 호출이며, main 메서드 안의 로직이 모두 실행되면 프로그램이 종료된다는 것입니다.

클래스와 클래스의 구성요소들은 객체 지향 프로그래밍을 공부하는 과정에서 디테일하게 설명드릴 예정이니, 우선은 "클래스에는 이러한 것들이 포함될 수 있구나!" 정도만 기억해 주시면 되겠습니다.

public, static, void, String[ ] args 등 낯선 키워드도 여럿 있었는데요. 이 또한 자연스레 알게 되실 것들이니 걱정하지 않으셔도 됩니다.

이번 글을 통해 자바 프로그램을 작성하는 방법과 실행하는 방법을 익혔으니, 지금부터는 실전입니다. 다음 글에서는 자바의 변수에 대해 공부해 보도록 하겠습니다.

오늘도 방문해 주신 여러분께 감사의 말씀을 드립니다! 좋은 하루 보내세요 :)

반응형

댓글