Home Java 프로그래밍 교육 1일차
Post
Cancel

Java 프로그래밍 교육 1일차

자바의 중요한 특징 중 하나는 플랫폼 독립적 이라는 것이다.

자바의 구동 원리는 아래와 같다.

image

  1. 개발자는 XXX.java 라는 파일명의 자바 코드를 작성한다. 이를 원시소스라고도 한다. 
  2. 기계는 원시소스를 알아듣지 못한다. 컴파일러 javac.exe 파일은 이를 기계어로 번역해주는데 이 과정을 컴파일이라 한다.
    컴파일 결과물이 바로 XXX.class 이고 실행파일 이라고도 한다. 이름은 실행파일이나 바로 실행되지는 않는다.
  3. 컴파일을 통해 탄생한 실행파일은 JVM 위에서 실행된다. JVM(Java Virtual Machine)은 자바가 실행되는 플랫폼이다. 실행파일 XXX.class는 기계가 바로 알아듣는 바이너리(binary) 코드가 아닌 바이트(byte) 코드이다. 때문에 바로 실행되지 않고 JVM 위에서 실행된다.

여기서 JVM을 제공하는 jdk 자체는 OS 의존적이다. 각 운영체제에 맞는 jdk를 설치해야한다.

image

이렇게 설치된 JVM은 OS(플랫폼)에 독립적이다. 즉, 같은 자바 소스는 모든 OS에서 동일하게 동작하게 된다.

* 소스파일 저장 시 컴파일이 동시에 같이 이뤄진다. 신텍스 에러등이 있을 경우 컴파일에 실패하며 저장 또한 되지 않는다.

참고로 자바 클래스 import 시 import 대상은 .java 파일이 아닌 컴파일된 .class 실행파일이다.

1
import com.XX.XXObject // import XXObject.class


자바 클래스의 구성 요소에는 필드메서드가 있다.
메서드는 접근 지정자와 반환 타입, 메서드명을 지정하는 선언부와 메서드의 동작을 기술하는 구현부로 이뤄져있다.
코드의 재사용성과 객체 지향적 프로그래밍을 위해 필드에 직접 접근하는 방식보다는 메서드를 통해 필드에 접근하는 것이 좋다.

this 키워드는 객체 자신의 정보를 저장하며 setter나 메서드 구현 시 로컬 변수와 필드를 구별하기 위해 사용한다.

자바 클래스는 크게 두 가지로 나눌 수 있다.

  • Object 클래스
    메인(main) 메서드 없이 필드와 메서드로만 이뤄진 클래스이다. 모든 클래스는 컴파일 대상이 된다. 
  • 실행 클래스
    메인 메서드가 있는 클래스로 JVM이 자바 프로그램 실행 시 메인 메서드에서 시작한다.
1
public static void main(String[] args) {}

메인 메서드 또는 그 외 자바 프로그램 구현 시 두 가지를 해야한다.

  • 객체 생성
    메모리(JVM)에 클래스와 클래스 필드들을 올린다. 
    클래스는 필드와 메서드로 구성된 파일이다. 이를 메모리에 올려 값이 할당되었을 때 비로소 객체가 된다.

  • 객체 접근
    객체 접근 방식은 두 가지 단계로 나뉜다.

    • 변수 초기화
      처음 값을 지정하는 때만을 지칭하는 것이 아니라 변수에 값이 할당되는 모든 순간을 의미한다.
    • 함수 호출
      메서드 호출 시 호출한 메서드 구현 부분으로 간다. 구현부 실행이 완료되면 리턴값을 갖고 다시 원래 소스코드로 돌아온다. ;(세미콜론)는 문장의 끝을 의미하기도 하지만 함수 호출을 의미하기도 한다.


클래스 간의 관계는 수평적인 관계와 수직적인 관계로 나눌 수 있다.

  • 수평적인 관계 (Hasing a Relationship)
    한 클래스가 다른 클래스를 갖고 있는 관계이다. 예를 들어 학생(Student)이 책(Book)을 갖을 때 Student 객체 안에 Book 클래스 타입의 필드를 갖는다.
    의존성 주입 방법에는 필드와 setter가 있다. 
  • 수직적인 관계 (Is a Relationship)
    부모 클래스와 자식 클래스 관계이다. 책(Book)이라는 클래스가 있을 때 이를 상속받은 동화책과 소설책 클래스를 만들 수 있다. 동화책과 소설책 객체는 선언 시 클래스 타입에 부모 클래스인 Book이 와도 된다.
    implements, extends 키워드가 여기에 해당한다.

생성자(constructor) 는 객체가 생성될 때 마다 구동되는 것을 의미한다. 클래스마다 무조건 하나 이상의 생성자가 존재한다.

변수에 값이 할당되는 초기화는 묵시적 초기화와 명시적 초기화로 나눌 수 있는데

  • 명시적 초기화는 변수에 기본값이 할당되는 것이다.
  • 묵시적 초기화는 변수에 직접 값을 넣는(기본값을 덮어쓰는) 것이다.

이와 동일하게 생성자도 묵시적 생성자와 명시적 생성자로 나눌 수 있다.

  • 묵시적 생성자(기본 생성자)
    인자와 내용이 없는 클래스 명과 동일한 메서드다. 아무런 값도 대입하지 않는 것처럼 보이지만 메모리에 클래스를 올릴 때 기본 값으로 세팅된다.

    1
    2
    3
    
    public class A {
        public A(){}
    }
    
  • 명시적 생성자는 인자로 받은 값들을 필드에 대입한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public class A {
        
        private String field1;
        private char field2;
        private boolean field3;
            
        public A(String field1, char field2, boolean field3){
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
        }
    }
    

개발자가 기본 생성자를 작성하지 않으면 컴파일러는 기본 생성자를 알아서 생성한다. 하지만 명시적 생성자가 한개 이상 있을 경우 개발자가 직접 기본 생성자를 작성해줘야 한다. 기본 생성자나 올바른 생성자가 없으면 컴파일 오류난다.

new 키워드는 객체 생성 키워드이다. 

1
A a = new A();

image

  1. Stack에 객체 a를 위한 공간이 만들어진다. 이때 아직 값이 없는 상태이다.
  2. a의 변수 타입 A에 따라 A의 필드들과 A 메서드 주소를 위한 공간이 Heap에 만들어진다. 이때 필드들은 기본값으로 세팅된다.
  3. Heap 메모리에 객체를 위한 공간이 만들어지면 해당 공간의 주소가 생긴다. 그리고 Stack에 해당 주소값이 저장된다.
    객체 생성의 결과는 주소이고 객체 a는 Heap의 메모리 주소를 참조한다. a를 참조 변수 또는 객체 변수라고 부를 수 있다.
  4. 이후 setter나 기타 메서드로 필드에 값이 할당되면 Heap의 기본값을 덮어쓴다.
    명시적 생성자로 객체를 생성하더라도 묵시적 초기화(기본값으로 초기화) 후 값을 덮어쓰게 된다.

객체 생성(필드 주입) 방법에는 두 가지 setter생성자가 있다. 각 방법마다 쓰임새나 사용하는 때가 다르다.

  • 자동차에 엔진을 주입해야할 때 > 생성자
    객체가 생성과 동시에 필수로 지녀야 하는 하는 값은 생성자로 주입한다. 생성자로 주입되는 것은 객체와 생성 및 소멸(생명 주기)을 같이 한다.
  • 자동차에 네비게이션을 주입해야할 때 > setter
    생성 이후 주입되는 값 또는 객체와 생명 주기를 같이 하지 않는 값들은 setter로 주입한다.
This post is licensed under CC BY 4.0 by the author.