반응형

인터페이스의 특징

1. class 대신 interface 선언이 붙어있고, 메소드는 구현없이 선언부만 존재합니다.

인터페이스는 다음과 같이 생겼습니다.

기본 골격은 클래스와 동일합니다.

이렇게 메소드의 구현부 없이 선언부만 존재하는 메소드를 가리켜 '추상 메소드(Abstract Methods)' 라 합니다.

interface Printable {
    public abstract void print(String doc); //추상 메소드
}

 

2. 인터페이스를 대상으로는 인스턴스 생성이 불가능합니다.

따라서 아래의 코드처럼 다른 클래스에 의해 다음과 같이 상속이 될 뿐입니다.

이 때 키워드 implements 가 사용됩니다.

package interfaceAndAbstractClass;

interface Printable {
    public abstract void print(String doc); //추상 메소드
}

class Printer implements Printable {

    @Override
    public void print(String doc) {
        System.out.println(doc);
    }
}

public class PrintableInterface {
    public static void main(String[] args) {
        Printable printable = new Printer();
        printable.print("abc");
    }
}

다만 아래의 코드와 같이 익명클래스를 구현할 수 있습니다.

익명 클래스의 형태로 정의하면 아래의 코드처럼 클래스의 정의와 인스턴스의 생성을 하나로 묶을 수 있습니다.

interface Printable {
    public abstract void print(String doc); //추상 메소드
}

public class PrintableInterface {
    public static void main(String[] args) {
        Printable printable = new Printable() {
            @Override
            public void print(String doc) {
                System.out.println(doc);
            }
        };
        printable.print("abc");
    }
}

그리고 이 익명클래스는 람다표현식을 이용해 아래와 같이 간소화 될 수 있습니다.

이 때 람다표현식과 익명 클래스는 분명히 다릅니다. (내부적인 동작 원리가 다릅니다.)

interface Printable {
    public abstract void print(String doc); //추상 메소드
}

public class PrintableInterface {
    public static void main(String[] args) {
        Printable printable = System.out::println;
        printable.print("abc");
    }
}

 

3. 한 클래스는 둘 이상의 인터페이스를 동시에 구현할 수 있습니다.

4. 상속과 구현은 동시에 가능합니다.

따라서 Robot이라는 클래스가 Machine 클래스를 상속하면서

인터페이스 Movable, Runnable 을 구현한다면 다음과 같이 정의할 수 있습니다.

class Robot extends Machine implements Movable, Runnable {}

 

5. 인터페이스의 형을 대상으로 참조변수의 선언이 가능합니다.

6. 인터페이스의 추상 메소드와 이를 구현하는 메소드 사이에 오버라이딩 관계가 성립합니다.

따라서 어노테이션 @Override 선언이 가능합니다.


 

인터페이스의 본질적 의미

인터페이스의 사전적 의미는 '연결점' 또는 '접점' 으로 둘 사이를 연결하는 매개체를 의미합니다.

이와 관련하여 간단한 예를 들면

 


인터페이스 내의 메소드와 변수의 특징

  1. 인터페이스의 모든 메소드는 public이 선언된 것으로 간주합니다.
  2. 인터페이스의 추상 메소드는 abstract 예약어를 생략해도 됩니다. (추상 클래스는 추상 메소드 선언 시 abstract 예약어 생략 불가능)
  3. 인터페이스 내에 선언되는 변수는 선언과 동시에 초기화 해야 합니다.
  4. 인터페이스 내에 선언되는 변수는 모두 public, static, final 이 선언된 것으로 간주합니다.결론적으로 인터페이스 내의 변수는 상수입니다.따라서 상수는 대문자로 이름을 짓는 관례를 따라 인터페이스 내에 변수의 이름은 대문자로 작성합니다.

인터페이스의 문법 구성과 추상 클래스

인터페이스에는 다음 세 가지 종류의 메소드만 존재할 수 있습니다.

1. 추상 메소드

2. 디폴트 메소드

3. static 메소드

 

그리고 인터페이스 간 상속도 가능하며 인터페이스의 형(Type) 이름을 대상으로 instanceof 연산을 할 수도 있습니다.

즉 많은 특성이 클래스와 유사합니다.

 

1. 추상 메소드

2. 디폴트 메소드

3. static 메소드

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#1 자바 개발 핵심 원칙  (0) 2022.07.11
[Java] 컴파일(Compile)의 이해  (0) 2020.11.04
[JAVA] 구조 개념 및 명명 규칙  (0) 2020.11.03
반응형

이펙티브 자바 3판의 기술 용어는 대부분 JAVA 1.8 의 명세를 따르며, 주요 사항은 다음과 같습니다.

 

자바가 지원하는 자료형(Type)

1. 인터페이스(Interface)

2. 클래스(Class)

3. 배열(Array)

4. 기본 타입(Primitive)

 

애노테이션(Annotation) 은 인터페이스의 일종이며,

열거 타입(Enum) 은 클래스의 일종입니다.

네 가지 타입 중 처음 세 가지는 참조 타입(Reference Type) 이라고 합니다.

즉, 클래스의 인스턴스와 배열은 객체(Object) 인 반면, 기본 타입 값은 그렇지 않습니다.

 

클래스의 멤버로는 필드(Field), 메서드(Method), 멤버 클래스, 멤버 인터페이스가 있습니다.

메서드 시그니처는 메서드 이름과 입력 매개변수(Parameter)의 타입들로 이뤄집니다. (반환값의 타입은 시그니처에 포함되지 않습니다.)

 

반응형
반응형

자바 개발의 핵심적인 기본 원칙은 바로 명료성과 단순성이다.

이 두 가지는 무엇보다 중요하다.

컴포넌트는 정해진 동작이나 예측할 수 있는 동작만 수행해야 한다.

(컴포넌트란 개별 메서드부터 여러 패키지로 이뤄진 복잡한 프레임워크까지 재사용 가능한 모든 소프트웨어 요소를 뜻한다.)

컴포넌트는 가능한 작되, 그렇다고 너무 작아서는 안된다.

코드는 복사되는 게 아니라 재사용되어야 한다.

컴포넌트 사이의 의존성은 최소로 유지해야 한다.

오류는 만들어지자마자 가능한 한 빨리 잡아야 한다. (되도록 컴파일타임에 해결되어야 한다.)

 

이 규칙들이 100% 옳을 수는 없겠지만, 거의 모든 경우에 적용되는 최고의 모범 사례일 것이다.

이 규칙들을 생각 없이 맹종하진 말아야 하나, 어겨야 할 때는 합당한 이유가 있어야 한다.

-이펙티브 자바-

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#3 인터페이스  (0) 2022.08.22
[Java] 컴파일(Compile)의 이해  (0) 2020.11.04
[JAVA] 구조 개념 및 명명 규칙  (0) 2020.11.03
반응형

컴퓨터 프로그램 만드는 일을 프로그래밍이라 하고,

프로그램 만드는 사람을 프로그래머라고 합니다.

 

프로그래밍이란 컴퓨터가 일을 하도록 명령을 하고 그 명령을 실행하게끔 하는 과정입니다.

이 때 우리는 컴퓨터에게 1부터 100까지 더하라고 명령하고 싶습니다.

그렇다고 우리말로 '1부터 100까지 더하라.' 고 쓸 수는 없습니다.

그래서 프로그래밍 언어를 사용하는 것입니다.

 

그리고 이렇게 만든 프로그램이 프로그래밍 언어 문법에 잘 맞는지 확인하고,

컴퓨터가 이해할 수 있는 언어로 번역해야 합니다.

이 작업이 컴파일(Compile)이며 이를 수행하는 프로그램이 컴파일러(Compiler)입니다.

 

쉽게 말하면 컴파일은 프로그래밍 언어를 기계어로 번역해주는 과정입니다.

 

추가로 빌드는 컴파일러가 소스 코드를 컴파일하여 실행 파일을 만드는 과정을 말합니다.

자바는 빌드 과정을 통해 .class 파일이 만들어집니다.

그러므로, 컴파일이 빌드의 과정 중에 하나인 것이지요.

 

자바(Java)는 프로그래밍 언어 중 하나로, 자바 개발 환경을 설치하면 컴파일러도 함께 설치됩니다.

 

 


 

자바는 다른 프로그래밍 언어와는 구분되는 강점을 가지고 있습니다.

플랫폼에 영향을 받지 않고 다양한 운영체제에서 사용할 수 있다는 점입니다.

 

예를 들어 윈도우 운영체제에서 C언어로 개발한 Test라는 프로그램이 있습니다.

이 프로그램을 컴파일하면 Test.exe가 만들어집니다.

Test.exe는 윈도우에서 실행되는 '실행파일'이라고 합니다.

이 실행파일은 윈도우에서는 작동되지만 리눅스 운영체제에서는 사용할 수 없습니다.

만약 이 파일을 리눅스 운영체제에서 실행하려면, 리눅스 환경에서 다시 컴파일해서 리눅스 운영체제에

맞는 실행파일을 새로 만들어야 합니다.

 

하지만 자바에서는 Example이라는 이름의 프로그램을 만들고 컴파일하면 Example.class 파일이 생성됩니다.

이 파일을 바이트 코드라고 하는데 완벽한 실행파일이 아닙니다.

다시 말하면 운영체제에 맞는 완벽한 기계어가 아닌 중간 기계어입니다.

이 바이트 코드를 실행하려면 운영체제에 맞는 자바 가상 머신(JVM: Java Virtual Machine)이 필요합니다.

운영체제에서 직접 실행하는 게 아니라 가상 머신에서 먼저 실행하고,

이 가상 머신이 운영체제에 맞는 완벽한 실행파일로 바꿔줍니다.

즉 .class 파일을 만들어 두면 운영체제에 맞는 가상 머신을 이용하여 어느 환경에서나 실행할 수 있습니다.

 

자바 가상 머신(JVM)은 자바 실행 환경(JRE) 설치 시 함께 설치됩니다.

 

 

프로그래밍 언어는 사람이 이해하기 쉬울수록 고급언어,
컴퓨터가 이해하기 쉬울수록 저급언어입니다.

고급언어에는 C언어, Java 등이 있습니다.
저급언어에는 기계어, 어셈블리어 등이 있습니다.

이러한 특성 때문에 초기 자바는 프로그램 실행 속도가 느리다는 평이 많았지만,

하드웨어가 발전하면서 자바 컴파일러의 방식이 JIT(Just In Time)방식으로 개선되어서

실행 속도에도 문제는 없습니다.

 

컴파일의 세 분류
- 원시 코드를 바로 기계어로 변환하는 정적 컴파일(Static Compilation)
- 바이트코드 등의 중간 코드를 기계어로 변환하는 AOT 컴파일(Ahead Of Time Compilation)
- 실행시 최초 한 번에 한해 컴파일을 거치는 JIT 컴파일(Just In Time Compilation)
->JIT 컴파일러는 실행 시점에 기계어 코드를 생성하는데, 
같은 코드가 반복되면 매번 기계어 코드를 새로 생성하지 않고 이전에 만든 기계어를 재사용합니다.
또한 JIT 컴파일러는 운영체제에 맞게 바이트 실행 코드로 한 번에 변환하여 실행하기 때문에
이전의 자바 해석기방식보다 성능이 10~20배 좋습니다.

 


 

이 게시물의 내용을 그림 하나로 요약해봤습니다.

이상입니다.

좋은 하루 보내세요.

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#3 인터페이스  (0) 2022.08.22
#1 자바 개발 핵심 원칙  (0) 2022.07.11
[JAVA] 구조 개념 및 명명 규칙  (0) 2020.11.03
반응형

이 게시물을 작성하는데 이용한 IDE(통합 개발 환경)는 이클립스입니다.

 

프로젝트를 생성해서 개발을 진행하다 보면 파일의 전체적인 구조는 아래와 같이 이루어집니다.

실제로 우리가 코딩하는 부분은 클래스(.class) 파일입니다. (물론 실제로는 .java파일입니다.)

 

게시물을 읽기 전에 자신의 저장폴더와 비교하면서 읽으시면 더 깊은 이해에 도움이 될 것입니다.


 

◎공통 명명규칙
-대소문자 구분을 함.
-숫자로 시작할 수 없음.
-특수문자는 '_' 와 '$'만 사용가능.
-예약어(시스템에서 이미 사용하고 있는 이름. ex)Public Private 등 )를 사용하면 안됨.

 


[ 워크스페이스(WorkSpace) ]

-하나의 프로그램 단위.

-규모가 큰 프로그램은 여러 프로젝트로 이루어질 수 있음.

-가장 상위 폴더로 생성됨.

 

 

◎워크스페이스 명명 규칙
-공통 규칙에 따름

 


[ 프로젝트(Project) ]

-하나의 실행 파일을 생성하기 위한 단위이다.

-워크스페이스의 하위 폴더로 생성됨.

 

 

 

프로젝트 생성 전

 

 

프로젝트 생성 후

 

◎프로젝트 명명 규칙
-대소문자 구분없이 시작 가능.
-하지만 첫 문자를 비롯해 모든 단어는 대문자로 시작하는 것을 권장.

 

 


 

[ 패키지(Package) ]

-클래스를 기능별로 묶어둔 일종의 카테고리이다.

-하나의 패키지만 만들 수도 있고 "상위패키지.하위패키지.최하위패키지" 형태의 트리 구조를 만들 수 있다.

-상위 패키지 폴더 아래에 하위 패키지 폴더가 생성됨.

-소스코드를 저장하는 ".java" 파일의 패키지는 "src" 폴더에 저장됨.

-.java 파일을 컴파일해서 생성된 ".class" 파일의 패키지는 "bin" 폴더에 저장됨.

 

생성된 프로젝트 폴더

 

 

패키지를 생성

 

 

패키지를 "상위패키지.하위패키지.최하위패키지" 형태의 트리구조로 생성하니까

실제로 세 개의 폴더가 생성된 걸 확인할 수 있습니다.

 

◎패키지 명명 규칙
-단어 갯수와 상관없이 소문자로 시작.

-모두 소문자로 사용하는 것을 권장. (가독성을 위해서는 위반해도 됨)
-가급적 한 단어 사용을 권장. (상위 패키지 한단어, 하위 패키지 한단어씩)
-여러 사람 또는 기업과 협업할 경우 표준 패턴을 따름. (개인용으로 쓸 때는 무의미)

 


 

[ 클래스(Class) ]

-비슷한 유형의 메소드(함수)와 변수를 모아놓은 소스코드.

-실제로 작성된 최하위의 소스코드 파일.

-이클립스 에디터에 우리가 작성하는 코딩은 하나의 클래스를 생성하는 작업이다.

-클래스가 속한 최하위 패키지의 폴더에 저장됨.

-클래스의 파일명은 클래스의 이름과 동일해야 함.

 

실제 클래스를 생성

 

bin\park\jin\seong 폴더에 Practice .class파일 생성
src\park\jin\seong 폴더에 Practice .java파일 생성

 

◎클래스 명명 규칙
-대문자로 시작.
-명사로 시작.
-두 번째 단어부터는 소문자도 되지만 대문자로 시작하는 것을 권장.

 


[ 메소드(methods) ]

-클래스에 정의되어있는 함수.

-하나의 클래스에서 다른 클래스의 함수를 실행할 때 실제로 이 메소드를 실행하는 것.

-패키지A.패키지B.패키지C.클래스D.메소드 의 형태로 불러와서 실행함.

 

 

◎메소드 명명 규칙
-소문자로 시작
-동사로 시작
-두 번째 단어부터는 소문자도 되지만 대문자를 권장.

 

 

 


 

 

소문자 시작과 대문자 시작이 강제되는 이유는 패키지.클래스 형태로 호출되는 구조를 사용하기 때문에

클래스와 패키지를 구분하기 위함입니다.

쉽게 생각하면 마지막에 대문자로 시작되는 것을 클래스라고 생각하시면 됩니다.

 

이번 게시물에서 꼭 기억하셔야 할 것은 명명 규칙과 아래 그림의 구조입니다.

이상입니다.

 

 

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#3 인터페이스  (0) 2022.08.22
#1 자바 개발 핵심 원칙  (0) 2022.07.11
[Java] 컴파일(Compile)의 이해  (0) 2020.11.04

+ Recent posts