...
자바 소스코드의 구조
본격적으로 자바(Java) 문법에 대해 배우기 전에, 전반적인 자바 소스 코드가 어떤식으로 구성이 되어있는지에 대해서 알아보자.
보통 일반적인 자바 소스코드는 다음과 같은 형태로 만들어 진다.
[ Sample.java ]
/* 패키지 선언 */
package com.oracle.util;
/* 패키지 가져오기 */
import java.lang.*; // 해당 패키지 내 모든 클래스를 불러옴
/* 클래스 블록 */
public class Sample {
/* 메인 메소드 블록 */
// [public|private|protected] [static] (리턴자료형|void) 메소드명1(입력자료형 매개변수, ...)
public static void main(String[] args) {
/* 명령문(statement) */
int result = add(1, 2);
System.out.println(result);
}
/* 메소드 블록 */
public static int add(int a, int b) {
return a + b;
}
}
패키지 선언
- package 키워드란, 자바 클래스 파일들을 모아 기능별로 분류하기 위한 일종의 디렉토리라고 보면 된다. (파일 시스템 폴더)
- 클래스를 컴파일하면 첫 줄에 자동 생성되며, 클래스를 식별하는 관리자 역할을 한다. 이외에도 클래스명이 충돌하지 않도록 카테고리화 한 것으로 보면 된다.
- 패키지 이름으로는 숫자와 특수문자( _ 와 $ 제외 ) 사용이 불가능하며, 모두 소문자로 작성해야 한다.
- 실무에서 다양한 회사와 협업할 경우에, 중복 방지를 위해서 다음과 같이 도메인을 사용하여 만든다. (파일 폴더 경로 대신 점(.)을 이용해 표현)
- 패키지의 점(.)은 [상위패키지].[하위패키지].[클래스] 을 의미한다.
- 예를들어 패키지명 com.oracle.util 은 폴더 파일 경로 com\oracle\util 와 같다.
JDK 11 이후 버전부터는 반드시 패키지를 요구하기 때문에 소스 코드 상단에 패키지를 만들어 선언 해야 한다.
하지만 JDK 8 이전 버전에서는 꼭 필요한 것은 아니다. 그래도 왠만하면 패키지를 선언하는 것이 좋다.
패키지 가져오기
- 다른 패키지의 자바 표준 API나 클래스 파일을 가져올 때 사용한다. (소스 코드 간략화가 목적)
- 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하는 역할
- 패키지 이름에는 패키지의 경로까지 포함한 풀 네임을 명시
- import 문을 선언할 때 별표(*)를 사용하면 해당 패키지에 포함된 모든 클래스를 사용 가능
import 주의할 점
import 문을 선언할 때 별표(*)를 사용하면 해당 패키지에 포함된 모든 클래스를 가져오지만, 모든 하위 패키지의 클래스까지 포함시켜주지 않는다.
따라서 하위 클래스까지 가지고 오고 싶다면 직접 하위 도메인 경로를 지정해 표현 하여야 한다.
import java.*;
// 하위 패키지 전체 불러오기
import java.awt.*;
import java.util.*;
또한 자바에서는 가장 많이 사용하는 java.lang 패키지에 대해서는 import 문을 사용하지 않아도 클래스 이름만으로 사용할 수 있도록 해주고 있다.
클래스 블록
- 클래스란 JAVA에서 객체를 생성하기 위한 설계도(template)이라고 생각하면 편하다.(ex: 붕어빵을 만들 때 붕어빵틀을 생각해보자)
- 클래스명은 반드시 소스 파일명과 일치해야 한다. (파일명 : Test.java 일 때
public class Test {}로 일치해야 한다.) - public 접근지정자가 지정된 클래스는 반드시 클래스 파일 내, 하나의 클래스만 존재할 수 있다.
- public은 다른 패키지에서도 사용할 수 있다는 뜻이다.
- 클래스 구성은 필드, 생성자, 메서드, 내부 클래스가 있다.
- 필드(field) : 객체의 데이터를 저장
- 생성자(constructor) : 생성된 객체를 초기화
- 메서드(method) : 객체의 동작을 실행
- 내부 클래스(lnner class) : 클래스나 인터페이스의 내부에 선언
public class Test {
public int fieldName; // 필드
public test() { ... } // 생성자
public void methodName() { ... } // 메서드
class Member { ... } // 내부 클래스
}
메인 메소드 블록
- main 메서드는 프로그램을 구동하는 메인 스레드이다.
- 자바 프로그램을 실행하면 자바 가상 머신은 클래스 내에 포함되어 있는
public static void main(String[] args)라는 시그니처를 갖는 메인 함수를 실행한다.
/* 메인 메소드 블록 */
// [public|private|protected] [static] (리턴자료형|void) 메소드명1(입력자료형 매개변수, ...)
public static void main(String[] args) {
// ...
}
메인 메소드 구성으로는 다음과 같다.
- public : 모든 클래스에서도 해당 변수나 메서드가 접근이 가능하다는 의미로 프로그램의 시작은 main이기 때문에 다른 곳에서도 호출할 수 있도록 public을 사용
- static : 자바가 compile이 되는 순간 가장 빠르게 정의되어 별도의 객체 생성 없이 모든 객체와 공유가 가능
- void : 별도로 return 값 없이 메소드를 실행하고 끝난다는 의미
- main : 이 메서드가 main 메서드라는 의미
- string[] args : 연속적인 문자열 데이터가 들어가는 저장 공간. 터미널에서 자바프로그램을 실행할때 인수를 줄수있는데 이 값이 이곳으로 들어오게 된다.
[ 메인 메서드가 없을 경우 ]
컴파일 할 때 프로그램은 알아서 main 메서드를 찾아 진입점으로 인식하기 때문에 main 메서드가 없으면 에러가 생기게 된다. 따라서 진입점(메인) 없는 라이브러리 형태의 프로그램을 작성하고자 할 때는 컴파일 할 때 옵션에 /reference를 사용하여 라이브러리 형태라는 것을 명시해 주어야 에러가 발생하지 않는다.
만일 main 메서드가 여러개 있을 경우 어떤 메서드를 진입점으로 사용할 것인지 컴파일러에 지시를 내려주지 않으면 역시 에러 발생한다.
명령문 (Statement)
- 자바(JAVA) 소스 코드 파일에는 클래스 한개가 들어있고 그 클래스 안에는 클래스가 필요로 하는 행동을 나타내는 메소드(method)가 한 개 이상 있고, 메소드(method) 안에는 해당 메소드가 어떻게 처리되어야 하는지에 대한 내용(Statement)이 들어가 있다.
- 문장(statement)은 컴퓨터에게 작업을 지시하는 최소 구성단위 이다.
- 문장의 끝은 항상 세미콜론(;)을 붙여서 하나의 문장임을 표시한다.
# 참고자료
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=justkukaro&logNo=220777298211
https://ingorae.tistory.com/465
https://blog.hexabrain.net/120
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.