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 생성
-
Eclipse에서 workspace를 설정하고 Java Project를 생성한다.Create module-info.java file 체크 해제
-
Next > → Finish → Open Perspective
-
Project 폴더 안의 src 폴더에 Class 파일 만들기
-
Package 이름은 도메인을 역순으로 쓰는 것이 일반적이다.
유니크하게 지어야하기 때문이다.
Package는 class를 모아둔 꾸러미(장바구니)라고 생각하면 된다. 다른 사람이랑 이름이 겹치면 안된다.
(ex) Domain: test.kakao.com → Package: com.kakao.test
source code(file) 생성
- source code의 이름(file명) == class의 이름
- 정학히 말하면 public class의 이름(public class Student)으로 file명(Student.java)을 짓는다.
- public class가 없는 경우는 일반 class의 이름을 사용한다.
- 하나의 Java file 안에 class는 여러 개 나올 수 있다.
- 단, public class는 하나의 file에 2개 이상 존재할 수 없다.이렇게 하면 안된다!!
- 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에서
- class loader가 호출(class가 loading된다.)
- class 파일 검사 + 악성코드 check
- class 안의 main을 찾아서 호출
Language spec
- JavaScript와 거의 유사하다.
- 변수를 만들 때 식별자를 사용한다.
- 식별자의 Naming Rule은 동일하다.(Naming convension 유사)
- 정적 타입 언어라서 값 뿐만 아니라 변수에도 data type이 붙는다.
Java Data Type
Primitive type | Reference type |
---|
(정수형)byte → 1byte | Class(ADT) |
(정수형)short → 2byte | |
(정수형)int → 4byte | |
(정수형)long → 8byte | |
(실수형)float → 4byte | |
(실수형)double → 8byte | |
(문자형)char → 2byte | |
(논리형)boolean → 1byte | |
- 정수형 defalut:
int
- 4byte
- 가장 많이 사용한다. 효율이 가장 👍🏻
- -21억 ~ +21억
- 실수형 default:
double
- Java의 boolean은
true
, false
딱 이 자체로 존재함
- 다른 값으로 변환할 수 없다. (1, 0으로 타입 캐스팅 불가능)
상수
- 변수 앞에
final
keyword를 사용한다.
final int MY_SCORE = 100;
- 선언과 동시에 초기화해야 한다.(값을 할당해야한다.)
- 상수는 모두 대문자로 쓰고 snake case를 사용한다.
형 변환
- 묵시적 형 변환
- 명시적 형 변환 →
Type casting
Class
- 객체 modeling
- ADT
JVM이 관리하는 Memory 구조
- Register
- 프로그램의 실행 포인터를 관리하는 영역
- JVM에 의해서만 제어된다.
- Runtime constant pool
- 정해져있는(만들어지는) 상수값들이 여기에서 관리
- Method Area
- class 자체에 대한 정보
- class를 처음 사용하는 시점에 Memory에 올라간다.
- Heap
- class로부터 만들어지는 instance
new
keyword로 생성되는 모든 instance가 저장
- Call Stack
- method가 호출되면 method를 위한 공간이 잡힌다.
생성자
- Java의 모든 class는 constructor를 1개 이상 가진다.
- 만약 constructor를 작성하지 않으면 default constructor가 (javac에 의해)자동 삽입
- constructor는 method가 아니다.
- return이 존재하지 않는다. (return type을 명시하지 않는다.)
- 이름이 class명과 동일하다.
- 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(접근 제어자)
- public
- (package에 상관없이)제약없이 사용가능
- 하나의 파일 안에 public class가 두 개 이상일 수 없다.
- protected
- package(default)
- 키워드를 안쓰면 default로 지정됨
- 같은 package 내에서만 사용가능
- private
정리
class
class는 package로 묶여있다.
- private field
- static field
- constructor 여러개(constructor overloading)
- 일반적인 business method는 public 설정
- private field에 대한 Getter/Setter method
- main method(optional)