클래스패스 (classpath)
옵션 -classpath는 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 한다. -classpath의 값으로 사용된 ".;lib"를 살펴보자
' . ' - 현재 디렉토리에서 클래스를 찾는다
' ; ' - 경로와 경로를 구분해주는 구분자
'lib' - 현재 디렉터리에 없다면 현재 디렉터리의 하위 디렉터리 중 lib에서 클래스를 찾는다는 의미다
package - 우리가 일반적으로 사용하는 자바에서의 폴더 디렉토리와 같은 개념으로 생각하면 된다
서로 다른 패키지에 있는 클래스를 가져오려면 import를 통해서 다른 패키지의 클래스를 로드할 수 있다.
src (source code) - 소스코드를 저장하는 디렉토리
bin (binary 2진수) - 컴파일된 클래스파일을 저장하는 디렉토리
' * ' - 일반적으로 프로그래밍에서 별표는 와일드카드라해서 모든것을 뜻한다
API (Application Programming Interface)
API란 자바 시스템을 제어하기 위해서 자바에서 제공하는 명령어들을 의미한다. Java SE(JDK)를 설치하면 자바 시스템을 제어하기 위한 API를 제공한다. 자바 개발자들은 자바에서 제공한 API를 이용해서 자바 애플리케이션을 만들게 된다. 패키지 java.lang.*의 클래스들도 자바에서 제공하는 API 중의 하나라고 할 수 있다.
지금까지 무수히 많은 예제에서 사용했던 코드다. 우리가 정의한 적이 없다. 문법적으로 봤을 때 println은 메소드가 틀림없다. 그런데 메소드 앞에 Sytem.out이 있다. System은 클래스이고 out은 그 클래스의 필드(변수)이다. 이 필드가 메소드를 가지고 있는 것은 이 필드 역시 객체라는 것을 알 수 있다. 그리고 System을 인스턴스화한적이 없음에도 불구하고 필드 out에 접근할 수 있는 것은 out이 static이라는 것을 암시한다.
System.out.println은 패키지 java.lang.*; 에서 파생된 것이며 자바에서는 사용자 편의를 위해 이 패키지를 자동으로 로드한다.
java.lang 은 자바 프로그래밍을 하기 위해서 필수적인 클래스들을 모아둔 패키지이다.
대표적인 자바 API의 패키지
java.lang - 자바 프로그래밍을 위한 가장 기본적인 패키지와 클래스를 포함하고 있다.
java.util - 프로그램을 제어하기 위한 클래스와 데이터를 효율적으로 저장하기 위한 클래스들을 담고 있다.
java.io - 키보드, 모니터, 프린터, 파일등을 제어할 수 있는 클래스들의 모음
java.net - 통신을 위한 기능들을 담고 있다.
접근제어자
public, private, protected, default 등과 같이 클래스 멤버 키워드 앞을 가르키는 문법을 접근제어자(access modifier) 라고 한다.
접근제어자는 클래스의 맴버(변수와 메소드)들의 접근 권한을 지정한다. 위 예제처럼 private를 사용할 수 없는데 정의하는 이유는 외부적으로가 아닌 내부적으로 사용하기 위함이다.
사용자들이 객체를 사용하는 입장에서 객체 내부적으로 사용하는 변수나 메소드에 접근함으로서 개발자가 의도하지 못한 오동작을 일으키지 않도록 로직을 보호하기 위해서는 맴버에 따라서 외부의 접근을 허용하거나 차단해야 할 필요가 생긴다
같은클래스 | 같은패키지 | 다른패키지 서브클래스 | 관계없음 | |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
사용가능한 접근제어자 별로의 상세기능이다. 중요하니 기억하도록 하자.
단, 여기서 중요한 것은 다른제어자들은 상속관계에서도 동일하다. 하지만 예외로 default는 같은 패키지일 경우에만 허용 가능하지만 protected는 다른패키지의 서브클래스라 하더라도 상속관계일 경우 접근가능하다.
클래스의 접근제어자 - public과 default
default는 접근 제어자를 붙이지 않은 경우 default가 된다. 클래스의 접근 제어자는 패키지와 관련된 개념이다. 즉 접근 제어자가 public인 클래스는 다른 패키지의 클래스에서도 사용할 수 있고, default인 경우는 같은 패키지에서만 사용 가능하다.
한가지 중요한 제약 사항이 있다. public 클래스가 포함된 소소코드는 public 클래스의 클래스 명과 소스코드(자바파일)의 파일명이 같아야 한다. 그 말은 하나의 소스 코드에는 하나의 public 클래스가 존재 할 수 있다는 의미다.
그 외의 제어자 - static, final, abstract, native, transient, synchronized, volatile, strictfp
하나의 대상에 여러 제어자를 같이 사용가능 (단, 접근제어자는 하나만 가능)
ex) public static final int a = 1 ;
static
abstract (추상적인)
(미완성 클래스,메소드 라고도 불린다)
abstract - 클래스나 메소드를 사용하기 위해서는 반드시 상속 또는 오버라이딩(재정의)해서 사용해야한다. 추상클래스의 의미를 가지고 있고 상속또는 오버라이딩(재정의)을 강제시키는 의미이다.
추상화가 왜 필요한가 ?
- 자식클래스에서 메소드를 오버라이딩 (재정의)를 하기 떄문에 부모클래스 에서는 메소드를 정의할 필요가 없으므로 미완성 메소드로 만들어 버린다. 일반적으로 부모클래스를 미완성클래스 (추상클래스)로 만든다. 미완성 클래스를 사용하여 객체 (인스턴스)를 생성할 수 없다.
이 예제는 오류가 나는 예제이다. 메소드 b의 선언 부분에는 abstract라는 키워드가 등장하고 있다. 오류가 나는 이유는 이 키워드는 메소드 b는 메소드의 시그니처만 정의 되어 있고 이 메소드의 구체적인 구현은 하위 클래스에서 오버라이딩 해야 한다는 의미다.
이렇게 내용이 비어있는 메소드를 추상 메소드라고 부른다. (클래스안에 abstract의 메소드가 하나라도 존재하면 그 클래스 전체에는 abstract 가 붙어야 한다)
부모 클래스에는 메소드의 시그니처만 정의해놓고 그 메소드의 실제 동작 방법은 이 메소드를 상속 받은 하위 클래스의 책임으로 위임하고 있다.
final
위에 abstract와 상반되는 개념이다
final - 클래스, 메소드, 변수의 상속,변경,확장을 금지하는 규제이다. 실행되는 과정에서 한번 값이 정해진 이후에는 변수 내의 값이 바뀌지 않도록한다. 부모 클래스가 될 수 없으며, 오버라이딩을 통한 재정의도 될 수 없다.
'Java' 카테고리의 다른 글
Java 기초 입문 7일차 (예외처리 throws, checked, unchecked) (0) | 2022.11.24 |
---|---|
Java 기초 입문 6일차 (Interface, 다형성, Exception, multi catch) (0) | 2022.11.23 |
Java 기초 입문 4일차 (class와 instance의 관계, 지역변수와 전역변수, 상속, 생성자, 오버로딩과 오버라이딩) (0) | 2022.11.21 |
Java 기초 입문 3일차 (객체 지향 프로그래밍, 클래스와 인스턴스) (0) | 2022.11.18 |
Java 기초 입문 2일차 (method, input output, GUI) (0) | 2022.11.18 |