2022.07.11 월요일

Java언어의 특징

Java는 OS(플랫폼)에 독립적 ⇒ JVM(Java Virtual Machine)

  • JVM 자체는 C언어로 만든다. JVM은 OS에 종속적이다.

  • C언어: 대표적인 compile(machine code로 변환) 계열의 언어

  • JavaScript: interpreter(해석: 소스코드 → 중간코드 → machine code) 언어

  • Java: source(확장자: .java) →(javac 명령어에 의해) bytecode(확장자: .class) → JVM이 한줄한줄 실행(interpreter)

    • Java는 C언어와 JavaScript의 중간 형태
  • 객체지향 개념을 가장 잘 표현하고 있는 언어

  • Hardware, memory에 대한 직접적인 제어가 안된다.

    • garbage collection에 의해서 memory가 자동으로 관리된다.
      • memory 자동 관리가 좋을수도 안좋을수도 있다. 가장 좋은 것은 프로그래머가 memory를 세밀하게 관리하는 것. 하지만 까다롭고 복잡하다.
  • Network와 (thread)분산처리

  • Dynamic Loading을 제공

    • class의 Loading이 동적으로 일어난다.

.java file의 형태

  • Java 프로그램은 class의 집합이다.
    • Java 프로그램은 전역(global)의 개념이 없다.
  • 기본적으로 file 1개 당 class 1개가 기본이다.
    - 하지만 꼭 그렇지만은 않다.

JVM

  • Java class library(API)
  • JDK 1.1 → JDK 1.2 → … → 💥JDK 1.5(Java 5)💥 → … → 💥JDK 1.8(Java 8)💥 → … → 💥JDK 1.11(Java 11)💥
    • 현업에서는 Java 8과 Java 11을 기반으로 가장 많이 쓴다.(Java 11로 많이 넘어감)
    • 지금은 Java 11을 base로 잡는 것이 좋다.

Programming paradigm

객체지향언어(Java)

  • 해결해야 하는 문제의 구성요소, 데이터가 어떻게 전달되는지 파악
  • 분석과 설계가 어렵다.
  • 유지보수에 강점

구조적, 절차적 언어(C)

  • 기능으로 프로그램을 세분화
  • 빠른 분석과 설계 → 빠르게 프로그램을 작성
  • 유지보수에 취약

현실세계를 구성하는 구성요소를 파악

(ex) 학생

  • 상태
    • 이름
    • 학번
    • 학과
    • 몸무게
    • 자산
  • 행위
    • 등교한다
    • 출석한다
    • 화장실간다.

→ Abstraction(추상화) ⇒ class를 이용한 Modeling

class는 객체 modeling의 수단이다.
상태 → 변수 → field
행위 → 함수 → method

Eclipse Java Project 생성

  1. Eclipse에서 workspace를 설정하고 Java Project를 생성한다.Create module-info.java file 체크 해제

  2. Next > → Finish → Open Perspective

  3. Project 폴더 안의 src 폴더에 Class 파일 만들기

  4. Package 이름은 도메인을 역순으로 쓰는 것이 일반적이다.
    유니크하게 지어야하기 때문이다.
    Package는 class를 모아둔 꾸러미(장바구니)라고 생각하면 된다. 다른 사람이랑 이름이 겹치면 안된다.
    (ex) Domain: test.kakao.com → Package: com.kakao.test

source code(file) 생성

  1. source code의 이름(file명) == class의 이름
    - 정학히 말하면 public class의 이름(public class Student)으로 file명(Student.java)을 짓는다.
  2. public class가 없는 경우는 일반 class의 이름을 사용한다.
  3. 하나의 Java file 안에 class는 여러 개 나올 수 있다.
    • 단, public class는 하나의 file에 2개 이상 존재할 수 없다.이렇게 하면 안된다!!
  4. program의 entry point(시작 지점)
    • 해당 클래스를 시작하기 위한 실행 지점
    • public static void **main**(String args[]){ }
      • main 입력 후 ctr + space 하면 자동완성
      • sysout 입력 후 ctr + space 하면 System.out.println(); 자동완성

[compile 과정] javac.exe Student.java → Student.class(결과 파일)
[interpret 과정] java.exe Student.class(.class는 쓰지 않는다.) → 실행

JVM

Eclipse에서 (Mac)fn + cmd + shift + f11로 Student 파일을 실행하면 JVM에서

  1. class loader가 호출(class가 loading된다.)
  2. class 파일 검사 + 악성코드 check
  3. class 안의 main을 찾아서 호출

Language spec

  • JavaScript와 거의 유사하다.
  • 변수를 만들 때 식별자를 사용한다.
    • 식별자의 Naming Rule은 동일하다.(Naming convension 유사)
  • 정적 타입 언어라서 값 뿐만 아니라 변수에도 data type이 붙는다.

Java Data Type

Primitive typeReference type
(정수형)byte → 1byteClass(ADT)
(정수형)short → 2byte
(정수형)int → 4byte
(정수형)long → 8byte
(실수형)float → 4byte
(실수형)double → 8byte
(문자형)char → 2byte
(논리형)boolean → 1byte
  • 정수형 defalut: int
    • 4byte
    • 가장 많이 사용한다. 효율이 가장 👍🏻
    • -21억 ~ +21억
  • 실수형 default: double
    • 8byte
  • Java의 boolean은 true, false 딱 이 자체로 존재함
    • 다른 값으로 변환할 수 없다. (1, 0으로 타입 캐스팅 불가능)

상수

  • 변수 앞에 final keyword를 사용한다.
    • final int MY_SCORE = 100;
  • 선언과 동시에 초기화해야 한다.(값을 할당해야한다.)
  • 상수는 모두 대문자로 쓰고 snake case를 사용한다.

형 변환

  • 묵시적 형 변환
  • 명시적 형 변환 → Type casting
    • ( )를 이용해서 형 변환한다.

Class

  1. 객체 modeling
  2. ADT

JVM이 관리하는 Memory 구조

  1. Register
    • 프로그램의 실행 포인터를 관리하는 영역
    • JVM에 의해서만 제어된다.
  2. Runtime constant pool
    • 정해져있는(만들어지는) 상수값들이 여기에서 관리
  3. Method Area
    • class 자체에 대한 정보
    • class를 처음 사용하는 시점에 Memory에 올라간다.
  4. Heap
    • class로부터 만들어지는 instance
      • new keyword로 생성되는 모든 instance가 저장
  5. Call Stack
    - method가 호출되면 method를 위한 공간이 잡힌다.

생성자

  1. Java의 모든 class는 constructor를 1개 이상 가진다.
    • 만약 constructor를 작성하지 않으면 default constructor가 (javac에 의해)자동 삽입
  2. constructor는 method가 아니다.
    • return이 존재하지 않는다. (return type을 명시하지 않는다.)
  3. 이름이 class명과 동일하다.
  4. instance의 초기화를 담당한다.

method overloading

method의 인자 개수와 type이 다르다면 이름이 같아도 다른 method로 구분한다.

⇒ 생성자에게도 적용(constructor overloading)

public class Student { 
	static int a = staticCall("1번");
	int b = staticCall("2번");

	public static int staticCall(String msg){
		System.out.println(msg);
		return 100;
	}
	
	public Student(){
		this.b = staticCall("3번");
	}
	
	public static void main(String[] args){
		System.out.println("4번");
		int c = staticCall("5번");
		Student s = new Student();
	}
}

💡 출력 순서
1번
4번
5번
2번
3번


“기본적인 class의 형태”
  • 많은 class를 만들어 낼 수 있다.
    • 이렇게 많은 class를 관리하고 재사용할 수 있어야 한다.
  • 가장 원시적인 방법
    • class file이나 source file을 project의 같은 폴더 내에 위치
    • 여러 개의 copy본을 유지하게 되서 결국은 유지보수에 문제가 발생

→ “package라는 논리적인 단위로 관련있는 class들을 묶어서 사용”

패키지가 없는 자바 클래스는 없다!

package 논리적인 단위 → 물리적으로는 folder로 표현(”import”를 이용)

Access Modifier


Access Modifier(접근 제어자)

  1. public
    • (package에 상관없이)제약없이 사용가능
    • 하나의 파일 안에 public class가 두 개 이상일 수 없다.
  2. protected
  3. package(default)
    • 키워드를 안쓰면 default로 지정됨
    • 같은 package 내에서만 사용가능
  4. private
    • 같은 class 안에서만 사용가능

정리

class

class는 package로 묶여있다.

  1. private field
  2. static field
  3. constructor 여러개(constructor overloading)
  4. 일반적인 business method는 public 설정
  5. private field에 대한 Getter/Setter method
  6. main method(optional)

0개의 댓글