▶메인클래스(Main Class) 란?
public static void main (String [ ] args){ };
우리가 수없이 봤던 main메소드이다.
main 메서드의 의미는 args라는 이름을 다루는 변수를 정의할 것인데 이는 문자열이라는 데이터타입(String)을 담을 수 있는 배열([ ]) 인 것이다.
( ) 안의 내용들은 ( )를 이끄는 main이라는 메소드의 파라미터이며, 이 메서드 앞에는 void가 붙어있어 출력값이 존재하지 않는 다는 것을 우린 알 수 있다.
main은 하나의 예약어로 자바가 우리를 대신하여 main이라는 메서드를 실행하기에 어플리케이션의 시작점이라고 할 수 있다.
▶패키지(Package)
우리가 패키지를 생성하면 자연스럽게 프로젝트 폴더가 생성이 된다.
src는 프로젝트라는 폴더(=디렉토리) 밑에 소스코드들을 저장해주는 폴더이고 src폴더에 들어가면 우리가 만든 클래스들이 하나의 파일형태로 정리가 되어있는 것을 볼 수 있다.
패키지는 클래스의 묶음 단위이다.
우리가 하나의 주제로 폴더를 만들 때 여러개의 파일을 만드는 것 처럼 클래스를 용도별이나 기능별로 그룹화 한 것이 패키지라고 할 수 있다.
▶패키지(Package) 사용 이유
자바는 동일한 이름에 몹시 민감하다.
그래서 같은 패키지에 동일한 클래스명을 복수로 생성할 순 없다.
아주 간단한 프로젝트라면 딱히 문제가 없겠지만 만약 대규모프로젝트이고 사용해야하는 기능이 한정적일 때 우리는 변수명에 대한 고민에 많은 시간을 써야할 것이다.
그래서 사람들은 이를 해결할 방법을 생각했고 패키지라는 개념을 만들어낸다.
즉, 패키지는 이름의 충돌이라는 고질적인 자바의 오류를 해결하기 위해 만들어진 하나의 해결방법이다.
만약 서로 같은 패키지안에 동일한 클래스명이 있다면 같은 이름 오류가 나지만 서로 다른 패키지에 존재하는 클래스라면 이름이 동일해도 충돌이 나지 않는다.
즉, 같은 패키지 밑에 같은 이름은 존재 못하지만 각각 다른 패키지에 속해있다면 다른 클래스와 이름이 동일하더라도 충돌이 발생하지 않는다는 것이다.
현재 패키지에 있는 클래스가 아닌 다른 패키지안에 있는 클래스를 가져오겠다고 하는 의미임으로 b에서 a 로드를 원한다면 요로코롬 사용가능
▶패키지명 정하기
패키지 이름 역시 변수명을 정하는 것 처럼 네이밍이 몹시 중요하다고 할 수 있다.
이는 회사마다 다 다른 규칙이 있겠지만 가장 일반적인 경우를 이야기하자면 회사이름, 명확한 기능, 기능의 묶음 순으로 나열이 되어야한다는 이야기다.
예시를 들어보자
만약 SAMSUNG에서 사원들의 개인정보를 관리하는 패키지를 만든다고 가정을 한다면
com.samsung.name.user 으로 패키지 명을 만들어야한다는 것이다.
com.samsung = 회사명
name = 어떤 기능을 구현하는지를 나타내는 명확한 이름
user = 기능의 묶음이라고 생각하면된다.
user안에는 name도 있고 password도 있고 date도 있을 것이다.
이걸 모두 user로 묶어서 표현을 할 것이으로 임의로 기능의 묶음이라는 표현을 하였다.
com.koreait.shop.user로 패키지명을 만들었고 이 파일이 폴더로 넘어갔을 때 동일한 순서대로 폴더가 생성이 되는 것을 볼 수 있다.
이로서 패키지는 하나의 디렉토리라는 것을 우리는 정확하게 알 수 있다.
▶import
우린 개발을 하면서 다른 패키지 안의 클래스를 사용해야할 경우를 무조건 만날것이다.
다른 패키지 안의 클래스를 사용하기 위해서는 사용을 원하는 클래스 앞에 패키지를 붙히면 된다.
그러나 우리는 패키지의 이름이 몹시 길다는걸 알고있다.
그래서 매번 패키지 이름을 붙히는 것은 상당히 번거로운 작업일 것이다.
이를 간소화하고자 파일의 앞머리에 임포트(import)라는 작업으로 패키지 이름을 고정시킬 수 있고 임포트 작업을 해주면 다른 패키지 안의 클래스를 사용할 때 클래스 이름만 적어주면 된다.
단, 임포트를 하게되면 다르패키지와 클래스 명이 겹치면 자바에서는 이를 구분할 수 없기 때문에 클래스 충돌이 발생한다.
그래서 클래스 명이 동일한경우엔 어쩔 수 없이 임포트 작업이 아닌 패키지 명칭을 작성해주어야한다.
▶Classpath
클래스패스란 자바에서 클래스를 사용하려고 탐색을 할 때 JVM 혹은 자바 컴파일러가 사용하는 파라미터로 클래스나 패키지를 찾을 때 기준이 되는 경로를 말한다.
이 경로를 알아야하고 지정을 하는 이유는 우리는 어떤 프로그램을 만들 때 그 프로그램을 처음부터 끝까지 혼자 마느는 경우는 아주 드물다. 우린 다른사람이 만든 로직을 자신이 만든 프로그램으로 가지고 올 상황이 아주 많이 발생되는데 이 때 다른사람이 만든 클래스를 자신이 만들고 있는 클래스로 가져오기 위해서는 경로를 지정하고 알아야 할 필요가 있는 것이다.
또한, 여러개의 어플리케이션이 공통된 클래스를 사용하게 되는 경우에도 공통된 클래스를 읽어오기 위해서는 경로를 지정할 필요가 있다.
▶Classpath 경로
자바 폴더를 들어가보면 몇가지 파일이 있는 것을 확인할 수 있다.
우리는 여기서 bin과 src파일을 확인해볼거다.
그럼 src와 bin파일의 차이는 뭘까?
src는 source code파일(.java), bin은 byte code 파일(.class) 이다.
bin에는 컴파일이 완료된 파일들만 모아져있으며 bin에 Hello와 Korean을 제외한 파일은 컴파일이 되지 않은 파일들이기에 아직 .java로 남아있다고 볼 수 있다.
그리고 우리는 이 .class파일들이 모이는 경로를 Classpath 라고 부른다.
즉, classpath는 컴파일이 완료된 *.class 파일들이 위치하는 경로라고 할 수 있다.
이 두 파일을 구분해 둔 이유는 우리가 코드를 배포할 때 실행파일인 바이트코드파일 즉, Class파일만 배포하게 되는데 여기에 소스코드파일인 java파일이 섞여있으면 관리하기 불편하기 때문이다.
▶빌드(Build)
이렇게 .java파일에서 .class파일로 변경되는 과정을 "빌드"라고 한다.
일반적으로 빌드란 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과를 말하는 커다란 개념이다 .
빌드라는 하나의 큰 집합 안에 컴파일(compile),패키징(packaging), 배포(distribution)등이 있으며 컴파일 역시 빌드라는 집합의 부분집합이라고 이해하면 편하다.
▶라이브러리
한개 이상의 패키지들을 배포하기 용이하도록 압축한 형태로서 다른 프로그램에서 라이브러리 안에 포함된 기능을 활용할 수 있다.
하나의 기능 도서관이라고 생각하고 도서관에 있는 자료들을 꺼내쓰는 것이라고 이해를 하면 편하다.
*.jar 라는 확장자를 가지고 있는데 이 말은
다른사람들과 협업을 하고 파일을 공유해야할 때 10개쯤의 다량의 파일을 한군데에 묶어서 jar파일로 넘겨줄 수 있다는 것이고 이 jar파일을 라이브러리라고 부르며 다른 사람이 이 파일들을 import하여 자료들을 꺼내서 사용을 할 수 있다는 것이다.
우리가 자주 사용하는 println과 같은 개념이라고 생각을 하면 된다.
우리는 자연스럽게 println을 사용을 하였는데 우리는 어떻게 이 기능을 당연하게 사용하고 자바는 어떻게 알고 알아서 기능을 실행시켜주는걸까?
println과 같이 자바에서 기본적으로 제공되는 기능들을 API라고한다.
▶자바 기본 API
이클립스 기준으로 JRE를 보면 엄청나게 많은 jar파일들과 패키지가 있는 것을 확인할 수 있다.
우리가 사용하는 JDK는 이미 수많은 라이브러리가 포함이 되어있고, 이 라이브러리 안에는 프로그램 개발에 필요한 패키지들이 기본적으로 포함이 되어있어 우리가 그것들을 가져다가 사용을 했기에 println 같은 구문을 손쉽게 사용을 할 수 있었던 것!
자바 프로그래밍은 이런 라이브들의 기능을 활용하여 이루어진다.
이렇게 프로그램 개발을 위하여 JDK안에서 기본적으로 제공되는 기능들을 API라고 한다.
근데 이렇게 많은 기능들이 있는데 어떻게 우리가 이 기능들을 적재적소에 맞게 사용할 수 있을까?
그래서 자바에서는 사용설명서를 제공해주는데 이를 API 메뉴얼이라고 하며 오라클 홈페이지에 들어가 확인이 가능하다.
'국비필기노트 > Java' 카테고리의 다른 글
자바(java)_디자인 패턴, 싱글톤(singleton) (0) | 2022.03.26 |
---|---|
자바(java)_컴퓨터의 메모리 구조,Static (0) | 2022.03.25 |
자바(java)_추상화,추상 메서드,인터페이스,implements (0) | 2022.03.25 |
자바(java)_접근한정자 (0) | 2022.03.24 |
자바(java)_this와 this() (0) | 2022.03.22 |