Skip to content

Latest commit

 

History

History
290 lines (258 loc) · 10.8 KB

File metadata and controls

290 lines (258 loc) · 10.8 KB

00 들어가기 전에

  • 이 책은 문법 위주 보단 이해 중심의 지식들을 전달할 것이다.
    • 인터페이스를 예를 든다면, 그것이 왜 필요한가, 쓰면 생기는 장점대해

01 자바란 무엇인가?

1 - 자바에 대하여

  • 썬 마크로시스템즈 제임스 고슬링과 다른 연구원들이 개발. 객체 지향언어로 여러가지용으로 사용을 위해 탄생한 언어다.
  • 국내 자바 사용 비중이 상당히 높으며, 이는 오랜 시간 쌓여온 생태계 때문이기도 하다.

2- 자바의 특징

Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded, and dynamic language

  1. 간단하다 : 고급 언어들에서 반드시 필요하지 않다는 부분은 제거했다.
  2. 객체지향적이다 : 숫자, 노리 자료형등을 제외하면 모두 클래스로 만들어져 있다.
  3. 인터프리터 언어이다 : 정확히는 컴파일 동시에 인터프리터 언어다. 텍스트 소스를 컴파일, 2진 파일(클래스 파일)로 만들고 자바 런타임이 이 클래스 파일을 인터프리트 하여 실행된다. 시스템에 무관한 2진 파이로 만들기에 자바는 컴파일언어와 가까운 속도와 동시에 시스템 독립성을 얻었다.
  4. 강력하다 : robust 한 특징으로 포인터 연산을 지원하지않고, 리소스 관리(garbage collection)을 시행함으로써 시스템이 메모리에서 불필요한 부분을 삭제하는 방식이고, 메모리 누수 등의 문제등을 개선한다.
  5. 안전하다
  6. 플랫폼 독립적이다 : 자바의 실행 파일은 이진(클래스) 파일이고, 따라서 자바 런타임이 설치된 시스템이라면 어디든 동작하는 형태를 띈다. 이는 Virtual Machine 에 의해서 실행되기 때문이며 예전에는 이러한 방식이 다소 느리며 무거웠지만, 현재의 하드웨어 발전은 단점들을 해소한 상황이다.
  7. 멀티 쓰레딩을 지원한다
  8. 동적이다 자바 인터페이스를 이용하면 하나의 모듈을 갱신 시 다른 모듈 모두를 갱산하지 않아도 되며, 이는 인터페이스가 모든 인터페이스 변수와 도구의 실행문을 배제한 채 객체 간의 상호작용을 정의하기 때문이다.

3 - 안녕 세상아!

JDK 설치

~ 지금은 가장 최신 버전인 (ARM 지원) JDK 19 ARM64 버전으로 설치했다.

자바소스와 컴파일

  • JDK 를 설치하는 것만으로도 위 사진처럼 Java 명령어가 생기고, 해당 프로그램이 설치된다. (맥의 경우 /usr/bin/java)
  • JDK 를 설치하면 JAVAC 명령어도 설치되는데, 이때 해당 명령어가 없으면 JRE를 설치한 것이므로 재설치가 필요하다.

⛔️ JRE

JRE 란 Java Runtime Environment 의 약자로, 자바를 '실행'만 하기 위한 도구들이기에 컴파일을 위한 도구는 설치되지 않은 것이다.
  • 자바 파일은 .java라는 확장자를 가진자 파일로 저장하며, 이 파일은 두 단계를 걸쳐 프로그램화 된다
    • .class파일로 바꾸어 주는 컴파일 단계
    • .class파일을 실행하는 인터프리팅 단계

  • Compiler 는 javac.exe 에 해당하며, Java VM은 java.exe 에 해당한다고 하는 면에서 이는 맥에서도 동일한 방식으로 진행되는 것으로 보여진다.
  • 더불어 Java는 바로 컴파일 했을 때 실행 가능한 파일(executable file)이 아닌 class 라는 파일로 되는 이유는 JVM이라는 형태에서 돌아갈 수 있게 만들기 위해서다.

인텔리제이 설치

~ 설치 다함 ~ 첫 파일 만들기

public class HelloWorld {
}
  • class 를 새로 만들어보라고 하는 내용에서, 중요한 부분 : public 키워드는 자바 프로그래밍에서 매우 중요한 접근 지시자이다. 동시에 class 명 앞에 붙는 것의 경우 다른 의미를 갖기도 한다. 클래스 명과 파일 명이 동일한 경우 클래스에 public을 붙여 주어야 한다.

main 메소드

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"를 실행 시키는 것이 가능하다.

4 - 자바 산책하기

  • 자바 언어를 다루기 위한 워밍업 파트, 학습할 내용은 다음과 같다.
    1. 클래스 생성
    2. main 메소드 생성
    3. 변수
    4. 메소드
    5. 객체
    6. for 문
    7. 구구단 완성

클래스 생성

// GuGu.java
public class GuGu {
}

main 메소드

// 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 문

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);  
        }  
    }  
}