- 이 책은 문법 위주 보단 이해 중심의 지식들을 전달할 것이다.
- 인터페이스를 예를 든다면, 그것이 왜 필요한가, 쓰면 생기는 장점대해
- 썬 마크로시스템즈 제임스 고슬링과 다른 연구원들이 개발. 객체 지향언어로 여러가지용으로 사용을 위해 탄생한 언어다.
- 국내 자바 사용 비중이 상당히 높으며, 이는 오랜 시간 쌓여온 생태계 때문이기도 하다.
Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded, and dynamic language
- 간단하다 : 고급 언어들에서 반드시 필요하지 않다는 부분은 제거했다.
- 객체지향적이다 : 숫자, 노리 자료형등을 제외하면 모두 클래스로 만들어져 있다.
- 인터프리터 언어이다 : 정확히는 컴파일 동시에 인터프리터 언어다. 텍스트 소스를 컴파일, 2진 파일(클래스 파일)로 만들고 자바 런타임이 이 클래스 파일을 인터프리트 하여 실행된다. 시스템에 무관한 2진 파이로 만들기에 자바는 컴파일언어와 가까운 속도와 동시에 시스템 독립성을 얻었다.
- 강력하다 : robust 한 특징으로 포인터 연산을 지원하지않고, 리소스 관리(garbage collection)을 시행함으로써 시스템이 메모리에서 불필요한 부분을 삭제하는 방식이고, 메모리 누수 등의 문제등을 개선한다.
- 안전하다
- 플랫폼 독립적이다 : 자바의 실행 파일은 이진(클래스) 파일이고, 따라서 자바 런타임이 설치된 시스템이라면 어디든 동작하는 형태를 띈다. 이는 Virtual Machine 에 의해서 실행되기 때문이며 예전에는 이러한 방식이 다소 느리며 무거웠지만, 현재의 하드웨어 발전은 단점들을 해소한 상황이다.
- 멀티 쓰레딩을 지원한다
- 동적이다 자바 인터페이스를 이용하면 하나의 모듈을 갱신 시 다른 모듈 모두를 갱산하지 않아도 되며, 이는 인터페이스가 모든 인터페이스 변수와 도구의 실행문을 배제한 채 객체 간의 상호작용을 정의하기 때문이다.
~ 지금은 가장 최신 버전인 (ARM 지원) JDK 19 ARM64 버전으로 설치했다.
- JDK 를 설치하는 것만으로도 위 사진처럼 Java 명령어가 생기고, 해당 프로그램이 설치된다. (맥의 경우
/usr/bin/java
) - JDK 를 설치하면 JAVAC 명령어도 설치되는데, 이때 해당 명령어가 없으면 JRE를 설치한 것이므로 재설치가 필요하다.
- 자바 파일은
.java
라는 확장자를 가진자 파일로 저장하며, 이 파일은 두 단계를 걸쳐 프로그램화 된다.class
파일로 바꾸어 주는 컴파일 단계.class
파일을 실행하는 인터프리팅 단계
- Compiler 는 javac.exe 에 해당하며, Java VM은 java.exe 에 해당한다고 하는 면에서 이는 맥에서도 동일한 방식으로 진행되는 것으로 보여진다.
- 더불어 Java는 바로 컴파일 했을 때 실행 가능한 파일(executable file)이 아닌
class
라는 파일로 되는 이유는 JVM이라는 형태에서 돌아갈 수 있게 만들기 위해서다.
~ 설치 다함 ~ 첫 파일 만들기
public class HelloWorld {
}
- class 를 새로 만들어보라고 하는 내용에서, 중요한 부분 :
public
키워드는 자바 프로그래밍에서 매우 중요한 접근 지시자이다. 동시에 class 명 앞에 붙는 것의 경우 다른 의미를 갖기도 한다. 클래스 명과 파일 명이 동일한 경우 클래스에public
을 붙여 주어야 한다.
public class HelloWorld
{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
-
public : 메소드 접근 제어자, 이는 누구나 접근 가능하다는 의미.
-
static : 이 메소드는 인스턴스 생성 없이 실행 가능하다는 의미.
-
void : 메소드 리턴값이 없음
-
String[] : 문자열을 나타내는 자바의 자료형
-
args : String 자료형에 대한 변수명
-
System.out.println : 표준 출력으로 데이터를 보내는 자바의 내장 메소드로 문자열을 화면에 출력
-
이제 저장하고 실행을 시키면 우리가 익숙히 알고 있는
"Hello World"
를 실행 시키는 것이 가능하다.
- 자바 언어를 다루기 위한 워밍업 파트, 학습할 내용은 다음과 같다.
- 클래스 생성
- main 메소드 생성
- 변수
- 메소드
- 객체
- for 문
- 구구단 완성
// GuGu.java
public class GuGu {
}
// GuGu.java
public class GuGu {
public static void main(String[] args) {
}
}
// GuGu.java
public class GuGu {
public static void main(String[] args) {
int n;
}
}
- 기본적으로 우리가 아는 C 스타일을 그대로 지키고 있다. 구구단 처럼 만들면 다음처럼 만들 수 있다.
public class GuGu {
public static void main (String[] args) {
int n = 2;
int i = 0;
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
}
}
- 한개의 숫자를 받으면 구구단을 출력하는 메소드를 만들어보자.
public class GuGu {
public void dan(int n) {
int i = 0;
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
}
public static void main (String[] args) {
int n = 2;
//(...)
}
}
- public으로 선언을 한다는 것은, 어떤 메소드가 어디서든 호출이 가능하다는 것을 의미한다.
- static을 붙이지 않는 경우 클래스 내부에 속하는 것이 되고, 이 경우 클래스를 생성하고 이를 통해 호출하는 구조가 되어야 한다.
public class GuGu {
public void dan(int n) {
int i = 0;
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
}
public static void main (String[] args) {
int n = 2;
GuGu gugu = new GuGu(); // static 이 아니기 때문에 반드시 필요하다
gugu.dan(n); // 객체 내부의 메소드를 실행시킨다.
}
}
- 이러한 구조는 CPP의 그것과 유사하며, 객체 지향 언어의 기본적으로 공통적인 틀로 보인다.
public class GuGu {
public void dan(int n) {
int i = 0;
System.out.print(n);
System.out.println(" 단 ");
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
System.out.println(n * ++i);
}
public static void main (String[] args) {
int n = 2;
GuGu gugu = new GuGu();
gugu.dan(n++);
gugu.dan(n++);
gugu.dan(n++);
gugu.dan(n++);
gugu.dan(n++);
gugu.dan(n++);
gugu.dan(n++);
gugu.dan(n);
}
}
for (초기치; 조건문; 증가치) {
//(... 수행문 ...)
}
public class GuGu {
public void dan(int n) {
// int i = 0;
// System.out.print(n);
// System.out.println(" 단 ");// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
// System.out.println(n * ++i);
System.out.print(n);
System.out.println(" 단 ");
for (int i = 1; i < 10; i++) {
System.out.print(n);
System.out.print(" x ");
System.out.print(i);
System.out.print(" = ");
System.out.println(n * i);
}
}
public static void main (String[] args) {
int n = 2;
GuGu gugu = new GuGu();
// gugu.dan(n++);
// gugu.dan(n++);
// gugu.dan(n++);
// gugu.dan(n++);
// gugu.dan(n++);
// gugu.dan(n++);
// gugu.dan(n++);
// gugu.dan(n);
for(int i = 1; i < 10; i++) {
gugu.dan(i);
}
}
}
public class GuGu {
public void dan(int n) {
System.out.print(n);
System.out.println(" 단 ");
for (int i = 1; i < 10; i++) {
System.out.print(n);
System.out.print(" x ");
System.out.print(i);
System.out.print(" = ");
System.out.println(n * i);
}
}
public static void main (String[] args) {
int n = 2;
GuGu gugu = new GuGu();
for(int i = 2; i < 10; i++) {
gugu.dan(i);
}
}
}