▼ 부스트 코스의 [쉽게 배우는 자바1], [JAVA의 정석], 국비지원과정을 들은 후 정리한 내용입니다.

------------------------------------------------------------------------------------------------------------

1. 프로그램 실행구조

프로그램 실행 구조도 (원본출처는 국비 강사샘.. 위는 샘이 그린 걸 제식대로 수정한 것.)

 

2. 변수(Variable)

(1) 변수란?

: 변수란, 단 하나의 값을 저장할 수 있는 메모리 공간을 의미한다.
: 변수는 상수(constant)와 다르게 변화할 수 있는 수이다.


[※ 참조하기 : 메모리의 논리적 구조, 정수형과 실수형 데이터]









 

 

(2) 변수의 선언과 초기화

 

가. 변수를 선언 : int(변수타입)에 age(변수이름)을 적고 ;로 마침표를 찍는다.

 

나. 변수의 초기화 : 변수 선언 후 처음으로 값을 넣어주는 것

- 변수를 선언한 이후에 변수 안에 값을 넣어주어야 한다. 그렇지 않을 경우, 다른 프로그램에서 작성한 '알 수 없는 값(쓰레기 값)'과 충돌할 수 있다.
> int age = 25;

 

다. 서로 다른 두 변수의 값을 교환하는 방법 :

public class Variable
{ 
    public static void main(String [] args)
    { int x = 25; 
      int y = 30; 
      int tmp; tmp = x; 
      x = y; 
      y = tmp; 
    } 
}

 

라. 변수의 명명규칙

- 변수를 포함하여 프로그램에 사용하는 모든 이름은, '식별자(identifier)'라고 한다.
- 프로그램을 작성할 때는 항상 식별자 명명 규칙을 따라야 한다.
식별자(사용자 정의 명칭) 명명 규칙

1. 대소문자가 구분되며 길이에 제한이 없다.
- true와 True는 서로 다름
2. 예약어를 사용해서는 안된다.
- true는 예약어, True는 예약어가 아님
3. 숫자로 시작해서는 안된다.
- name1은 가능함, 1name은 불가능
4. 특수문자는 '_'와 '$'만 허용한다.

* 예약어란? 키워드 또는 리저브드 워드라고 함. 프로그래밍언어의 구문에 사용되는 단어를 의미

* 사용자 정의 명칭이란? 클래스명/메소드명/변수명/상수명 등...

* 추가적으로, 변수명 중간에 공백을 띄우면 안 됨.. (ex. myName (o), my Name(x))

 

(선택사항) 그 외 자바 프로그램어들에게 권장되는 규칙

1. 클래스의 첫 글자는 항상 대문자로 한다.
- 반면, 변수와 메서드 이름의 첫글자는 항상 소문자로 한다.
2. 여러 단어로 이루어진 이름은 결합되는 단어의 첫 글자를 대문자로 한다.
- 클래스명 :
  1) Pascal 표기법 : ex. StringBuffer
  2) Pascal+snake 표기법 : ex. String_Buffer
- 메소드명/변수명 : 
  1) Camel 표기법 : ex. myMoney
  2) Snake 표기법 : ex. my_money 
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '-'를 사용
ex. PI.MAX_NUMBER //snake표기법

* 자바에서는 모든 이름에 유니코드에 포함된 문자를 사용할 수 있으나, 가능한 클래스이름은 영문자로 하는 것이 좋다. 

* 패키지명은 대체로 소문자로 작성한다.

[※ 참고 : 기타 변수 표기법]

- 헝가리언 표기법 : 변수 앞에 접두어를 붙여 변수 성격을 표현

boolean bOk = "파리"=="새"; 
int nMoney = 100; 
char *pName = "홍길동"; //c언어 

 

(3) 변수 타입

※ 참조 : https://forsee.tistory.com/1

 

가. 데이터 타입

- 데이터 타입 :

값(data) 문자   'A', "ABC"
숫자 정수 -1, -2, 0, 1, 2
실수 1.23456, 5 X 10^2

- 변수를 선언할 때는, 저장하려는 값의 데이터 타입에 따라 변수 타입을 지정한다.


1) 기본형 변수(primitive type)

- 실제 값을 저장하며 연산이 가능하다.

크기 종류 자료형 Wrapper byte 표현 범위 연산/변환 출력서식 초기값
작다











크다
논리형 boolean Boolean 1 false, true X %b or %B flase
문자형 char Charater 2 0~65535  O %c '\u0000'
정수형 byte Byte 1 -128 ~ 127  O %d
(Decimal)
%o
(Octal)
%x
(Hexa)
0
short Short 2 -32768 ~ 32767  O
int Integar 4 -21 ~ 21  O
long Long 8 20자리 O 0L
실수형 float Float 4 10^-38~10^38 *정밀도 6-7 O %f 0.0f
double Double 8 10^-308~10^308 *정밀도 9 O 0.0d 또는 0.0

* 문자는 ascii코드에 따르면 1byte나, 자바는 유니코드를 따르므로 위에서 UTF-16 유니코드 기준 2byte로 쓰인 것
* JDK가 UTF-16에 따라 문자 인코딩(문자ㅡ숫자임, 0과 1로 인코딩) , 이것을 각 운영체제에 따라 화면에 디코딩할 때는 JVM이 동작하는 시스템에 따름.
* char은, 유니코드에 의해 정수형으로 컴퓨터에 저장되기 때문에 연산/변환 가능하나, string은 배열이기에 불가
* 정밀도가 높을 수록 오차범위가 낮음. 정밀도 = 7은, 10진수로 7자리 수를 오차 범위 없이 저장할 수 있다는 뜻

[※ 참고 : Scanner의 입력메서드 - next(), nextInt(), nextDouble(), nextBoolean(), nextLine()
- java.util.Scanner : java > util > Scanner클래스 
- Scanner의 next()와 nextLine()의 차이 : https://why-dev.tistory.com/21

[※ 참고 : System.out의 출력메서드 - print(), println(), printf() 설명]
- link : https://www.geeksforgeeks.org/difference-between-print-and-println-in-java/
- print(), println(), printf()로 콘솔창에서 받은 텍스트를 출력 가능 
- 3가지 모두 여러 자료형(char,char[],boolean,int,double...)을 받을 수 있도록 오버로딩되어 있음

1. print()와 println()의 차이
1) print();   : 텍스트 출력 후 콘솔창 끝에 커서가 남음(줄바꿈x) //다음 printinf은 여기서 시작
2) println(); : 텍스트 출력 후 다음줄로 이동

2. printf()의 출력서식
1) 정수형
     %d : decimal, 10진수로 출력. 
  %20d : 전체자릿수 20개 중에서 우측정렬로 10진수 출력
 %020d : 전체자릿수 20개 중에서 우측정렬로 10진수 출력하되, 공백은 0으로 채우기
 %-20d : 전체자릿수 20개 중에서 좌측정렬로 10진수 출력

2) 실수형 
     %f : 실수형으로 출력.
   %n.f : 전체자릿수 n만큼 출력, 우측정렬
%n.mf : 전체 자릿수 n중에서 소수점은 m만큼 출력, 우측정렬 //n보다 m이 크면 n 무시

3) 문자열 
 %20.5s : 전체 20개의 문자 중에 5개만 출력
package mymain;

import java.util.Scanner;

public class PrintTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String input = scan.nextLine();
//              int num = Integer.parseInt(input); 
		double num = Double.parseDouble(input);
		scan.close();     //이걸 안하면, resource leak : scan is never closed 나타남
		
//		System.out.printf("[%d]\n",num);
//		System.out.printf("[%20d]\n",num);
//		System.out.printf("[%020d]\n",num);
//		System.out.printf("[%-20d]\n",num);
		
		System.out.printf("[%-10.3f]\n",num);
		System.out.printf("[%-3.4f]",num); //전체자릿수 무시
	}

}

>> 결과

3.56549884846546564
[3.565     ][3.5655]

>> 위에서 //부분을 활성화하고 아래는 주석처리하면 결과는

[20]
[                  20]
[00000000000000000020]
[20                  ]

 

 

package mymain;

import java.util.Scanner;

public class PrintTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String input = scan.nextLine();
		scan.close();
		
		System.out.printf("[%20.3s]\n",input);
	}

}

>> 결과

// 입력 : 가나다라마바사아자차카타파하
[                 가나다]

 

2) 참조형 변수(reference type)

- 변수의 타입으로 클래스를 가지며, NULL을 포함한 객체의 주소(4byte, 0x0~0xffffffff)를 가짐
*단, JVM이 32bit가 아니라, 64bit일 경우, 객체의 주소 곧, 참조형 변수의 크기는 8byte임
- 참조형 변수는 컴퓨터공학에서 보았던 포인터 같다. 자바에서는 이 포인터가 (일종의 설계도인) 클래스의 객체들이 있는 주소를 담는다(=가리킨다)는 점에서 약간의 차이가 있어 보인다.
- 예시

Date today = new Date();

- 컴퓨터 공학에서 C언어를 통해 포인터로 메모리를 할당했던 것과 비교

//기본형 변수 : 변수는 기본형 값을 갖음
int number = 2; 
int p = &number; //p는 number의 주소를 담고 있음. 

//참조형 변수 : 변수는 할당받은 공간을 가리키는 주소값을 갖음
int *p = malloc(sizeof(int));

//주소는 운영체제의 크기에 따라서 32bit, 64bit가 될 수 있음

 

3) 오버 플로우

- 데이터 타입에 따라 변수가 가질 수 있는 저장공간이 지정되는데, 그 이상으로 값을 넣는 경우 오버플로우 발생

 

나. 상수와 리터럴(Constant & Literal)

(1) 상수 : 값을 한 번 저장하면 변경할 수 없는 저장 공간

- 변수 타입 앞에 final를 붙여 선언
- 상수는 모두 대문자로 작성하는 것이 관례이며, 길어질 경우 _로 구분

final int MAX_SPEED = 200;

(2) 리터럴 : 실질적인 값

- 수학에서 말하는 상수
- 위 박스 안의 200도 리터럴이고, 변수 안에 넣는 숫자도 리터럴
- final int FIRST_NAME = 'c'; 이면, 여기서의 'c'도 리터럴
▶ 리터럴의 타입과 접미사

종류 리터럴 접미사
논리형 false, true 없음
정수형 123, 0b0100, 077, 0xFF, 100L L
실수형 3.14, 3.0e8, 1.4f, 0x1.0p-1 f(float), d(생략가능)
문자형 'A', '1', '\n' 없음
문자열 "ABC", "1234", "A" 없음

* 실수형의 경우, 소수점만 적어도 되며, e를 통해서 10의 제곱을 표현할 수 있다.

int small = 12345; 
long big = 85_000_000_000L; 
float less = 0.345f; 
double more = 0.3456788999; 
more = 34.56788999e-2;


▶ 타입이 불일치 해도 사용이 가능한 경우 : 타입이 달라도 저장범위가 넓은 타입에 좁은 타입을 저장하는 경우

int firstIndex = 'A'; //A는 유니코드로 65를 의미함 

double Serial = 23456; //float을 double에 넣는 경우
[※ 참고하기 : ASCII코드] 

ASCII코드(통신문자코드) : 0~126

0~31 : 통신 및 제어문자
    '\r' : carriage return(Home) = '\r\n' : 맨 앞으로 가라, 그리고 엔터해라
    '\n' : new line(Enter)
    '\t' : tab key
    '\b' : caret(커서)의 위치를 이전으로 이동
    '\a' : alert경고음
    '\f' : 다음장으로 이동해라.

32~126 : 키보드상 문자코드
    '  ' : 32
    'A' : 65
    'a' : 97 //소->대문자 간격 : 32
    '0' : 48
    '1' : 49

문자 출력시에 
System.out.printf("%c\n",65); 가능하지만,
System.out.printf("%d\n",'한'); 은 불가능.

 

다. 문자 리터럴과 문자열 리터럴

 

(1) JAVA언어에서 String은 클래스를 의미한다.

- 컴퓨터 공학에서 string은 사실상 배열이었다. 그리고 string을 C언어로 표현하기 위해서는 char *name = " "; 처럼 표현을 했다. 만약 string을 쓰고 싶다면 #include 를 통해 string을 선언한 라이브러리를 가져와야 했다.
- 마찬가지로 JAVA언어에서도 string은 문자데이터들이 모인 공간, 곧 배열을 의미한다.
- 따라서 원칙적으로 String은 아래처럼 표현해야 하는 것이 맞다.
- 다만 java에서는 기본적으로 내장되어 있는 클래스가 있어서, String name = " "; 도 허용한다.

String name = new String("JAVA");

 

(2) 문자열의 결합

- + 연산자는 왼쪽에서부터 오른쪽으로 연산을 수행한다.
- JAVA에서는 +연산자를 활용해 [문자열 + 문자열]을 할 수 있으며, 문자열이 아닌 다른 타입과 결합할 경우 순차적인 연산을 이어가며 최종적으로는 문자열로 변환한다.

public class Variable
{ 
   public static void main(String[] args) 
   { 
      String name = "홍길동"; 
      System.out.println(1+name);
      System.out.println(name+1); 
      System.out.println(1+1+name); 
      System.out.println(name+1+1); 
   } 
}

>> 결과

1홍길동 
홍길동1 
2홍길동 
홍길동11

 

(3) 특수문자를 표현하는 방법

특수문자 문자 리터럴
줄바꿈 \n
역슬래쉬(\) \\
작은따움표 \"
큰따움표 \'


라. 형변환(Casting) : 변수 또는 상수의 타입을 다른 타입으로 변환시키는 것
- 형변환 규칙

1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
2. 기본형과 참조형은 서로 형변환할 수 없다.
3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

- 아래와 같이 x의 값을 가져다가 y로 형변환을 해서 가져갈 경우, x값은 그대로 남고 y에 값을 복사해서 준다.

public class Variable
{ 
   public static void main(String[] args) 
   { 
     double x = 2.23356; 
     int y = (int)x; 
     System.out.println(x); 
     System.out.println(y); 
   } 
}

>> 결과

2.23356 
2

**정수형 int를 실수형으로 바꿀 때, float으로 바꿀 경우, int는 정밀도가 10인데 float은 8이라 오차가 발생할 수 있다. 따라서, int를 실수로 바꿀 때는 double을 쓰는 것이 좋다.

 

3. 연산자(Operator)

(1) 연산자의 종류
- 연산자 : 연산을 수행하는 기호
- 피연산자 : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

종류 연산자 설명
산술 연산자 +, -, *, /, %, <<, >> 사칙연산 및 나머지(%)
비교 연산자 >, <, >=, <=, ==, != 크기
논리 연산자 &&, \\, !, &, \, ^, ~ AND, OR
대입 연산자 = 우변의 값을 좌변에 저장


(2) 연산자의 결합 규칙(우선순위)

1. 산술 > 비교 > 논리 > 대입 순의 연산 우선순위
2. 단항 > 이항 > 삼항. **단항은 -3과 같이 피연산자가 하나인 것
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽 *단항과 대입은 반대


(3) 산술 변환
- 두 피연산자의 타입이 같아야 산술 연산이 가능함 (형변환 연산자로 타입 일치 필요)
- 단, 작은 타입에서 큰 타입으로 형변환을 할 경우, 자동적으로 형변환이 이루어지므로 형변환 연산자 생략 가능
▶ 자동 산출 변환 규칙

1. 두 피연산자의 타입이 다를 경우, 보다 큰 타입으로 일치시킨다.
2. 피연사자의 타입이 int보다 작은 타입이면 int로 변환된다.
ex. short + byte = int + int = int
char + byte = int + int = int

- (주의) 연산결과의 타입이 피연산자와 다른 경우를 유의해야 한다.
ex. (int) 5 / (int) 2 = 2.5 의 경우, 둘 중에 하나를 (float)으로 형변환하여야만 함

>>산술 변환 외에 비교/논리/대입은 차후에 다시...

(4) 메서드를 사용한 연산 :
- Math.를 사용하여 사칙연산 외에 계산이 가능하다. (반올림이나 단순 비교 등)

public class Datatype
{ 
  public static void main(String[] args) 
  { //둘 중에 큰 수 출력 
    System.out.println(Math.max(9, 5)); 
    //올림 
    System.out.println(Math.floor(2.85786)); 
    //앞 수를 뒤 수로 나눈 값의 반올림 
    System.out.println(Math.floorDiv(18, 7)); 
  } 
}

 

1. 처음으로 코드 작성해보기 - System.out.prinlin("  ");

public class HelloWorldApp {
	//C언어의 int main(void) 함수 역할을 하는 녀석
	public static void main(String[] args) {
		//println = print line
		System.out.println("hello World!!");
	}
}

>> 결과

Hello World!!

 

 

2. 소스코드 컴파일링 & 실행

 

[방법1.에디터 미사용] 메모장을 이용해 컴파일 후 실행하기

* C언어에서는 clang 또는 make 명령어를 사용해서 컴파일을 했다면, JAVA는 javac를 사용해 컴파일을 한다.

 

가. cmd 경로 변경 : 소스코드(.java)가 있는 위치로 가기
**폴더명 다 치지 않고 일부만 친 후 + tab치면 알아서 폴더명 잡아줌
1) 폴더 하나씩 cd + 폴더명 칠 수도 있고
2) 한 줄로 다 칠 수도 있고
3) 폴더 경로 드래그에서 붙일 수도 있다.

나. 컴파일 하기 : javac/javac.exe + 자바파일명.java (ex. java.exe Hello.java)

*컴파일이란? 고급언어인 소스코드를 저수준언어로 변환하는 과정

*저수준 언어 = 실행파일 = binary code = byte code : .class형태로 저장된 파일 내용
1) javac.exe Hello.java 입력
2) javac Hello.java 입력

 

[※ 참고하기 : .java와 .class 의 구성내용 확인]

- 코드내용을 확인할 때 --- type 명령어 사용 ex. type Hello.java

- 아래를 보면 type Hello.java를 했을 땐 소스코드를 볼 수 있고,

- type Hello.class를 했을 때 알 수 없는 코드가 나오는 걸 볼 수 있다.

- 컴퓨터 공학에서 배웠던 C언어 컴파일링의 단계는 총 4단계로, 

  1) 전처리(Precompile) : 실질적인 컴파일링 전 #include와 같이 #이 들어간 코드에 대한 선작업을 먼저 해준다.

  2) 컴파일(Compile) : 어셈블리어라는 저수준 프로그래밍 언어로 컴파일

  3) 어셈블(Assemble) : 어셈블리 코드를 오브젝트 코드로 변환시켜주는 것. 중앙처리장치가 이해할 수 있는 0,1로 변경

  4) 링크(Link) : cs50.h나 math.h와 같이 여러개의 파일로 이루어진 경우, 이를 하나의 오브젝트 파일로 연결

  였다. 위에서도 보면 컴파일을 하게 되면 저수준 언어로 변경되는 걸 볼 수 있다.

[※ 추가 참고하기 : 프로그래밍 언어의 발전 역사]

1세대 언어 : 어셈블리어 (기계와 밀접한관계)
2세대 언어 : 인터프리터 (실시간 해석언어) - html, javascript 브라우저가 한줄씩 해석
3세대 언어 : 컴파일러 언어 
** C언어는 소스코드를 컴파일(전체 해석)하고 컴파일한 것을 컴퓨터가 바로 실행
** 자바는 JVM이 소스코드 한줄에 대한 컴파일코드에 대해 한줄씩 실행 (인터프리터 장점 + 컴파일러 언어 장점)
** 컴파일러 언어는 속도는 빠르지만 실시간 한줄 실행이 아니라 메모리 공간을 크게 사용할 수 밖에 없음
** 인터프리터는 실시간으로 해석하면서, 필요하면 공간을 만들고 아니면 안 쓸 수 있어 속도는 느려도 공간 활용이 좋음

 

[※ 참고하기 : .java 파일저장 및 컴파일 중 인코딩 타입 에러가 난 경우]

(ex. 한글을 넣었는데, 인코딩 타입이 UTF-8이 아니라 다른 거라며 버그가 나타남)

- javac -encoding utf-8 파일명.java

- 추가 참조 링크 : https://breathtaking-life.tistory.com/96

UTF-8로 인코딩 되게 .java 저장함
컴파일을 하니, 한글을 못읽는다.&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;
문제는 컴파일 과정에 있던 모양이다. javac 뒤에 -encoding utf-8을 추가하여 해결했다.

 

다. 실행하기 - java + 클래스파일명 (ex. java Hello)

-  cmd에서 javac 명령어로 컴파일 할 때 확장자는 쓰지 않는다. 

 

 

[방법2. 에디터 사용] 이클립스를 활용해 컴파일 후 실행하기

 

가. 이클립스 설치하기

- 다운로드 링크 : https://www.eclipse.org/downloads/packages/

 

Eclipse Packages | The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 350 open source pro

509 MB 785,390 DOWNLOADS Tools for developers working with Java and Web applications, including a Java IDE, tools for JavaScript, TypeScript, JavaServer Pages and Faces, Yaml, Markdown, Web Services, JPA and Data Tools, Maven and Gradle, Git, and more. Cli

www.eclipse.org

 

나. 이클립스 실행하기 - 워크 스페이스 경로 설정

- 처음 이클립스 실행하면 디폴트 저장 경로를 설정할 수 있다. 

 

다. 프로젝트 형성하기

1) File>New>Java Project

2) 프로젝트 설정하기

프로젝트 설정하는 순서

[1] 프로젝트명 : 프로젝트가 저장될 상위 폴더
[2] JRE환경 설정 : 실행할 때, 어떤 JRE 버전 쓸 건지
[3] Project layout : 첫번째는 소스코드와 실행코드가 같은 폴더 내에 위치, 두번째는 각각 src/bin폴더 내에 위치한다.
[4] [Next] 선택 후 [Apply and Close]하여 완료

//.java와 .class 저장 위치 수정하려면 properties>Java Build Path>Source로 가면 된다.

[※ 참고 : 외부 또는 내부에서 이클립스로 프로젝트 가져오기]

이클립스 에디터 사용한 프로젝트 가져오기

1. New>import>Exsting Projects into Workspace

2. 경로 지정하여 가져오기

이클립스 에디터 사용하지 않은 프로젝트 가져오기
1. new>project>java project 설정하고, 폴더명 경로 지정하여 가져오기

※ 메모장으로 작성한 코드는, 가져올 경우 인코딩 타입에 따라서 한글이 깨질 수 있음. (원본 소스코드를 긁어 오는게 빠르다.)

 

라. 작업 시작하기 - 클래스를 생성하자.

1) New > Class

2) 내용 작성하고 완료하기

 

 

마. 컴파일 하고 실행하기 : .java에서 ctrl+s를 하면 컴파일도 알아서 해준다. 실행은 재생 버튼을 누르기

* 이클립스 에디터를 사용하면, 굳이 cmd에서 명령어를 안 써도 소스코드 작성 후 ctrl+s만 눌렀을 때 알아서 컴파일을 해준다.

[참고 : 알면 좋은 내용들]

이클립스 프로그램 언어 확인 및 변경([x]하단)
1. 확인 : properties 우측 아이콘에 마우스 올리기
2. 변경 : properties 아이콘 더블클릭 

이클립스 단축키
1. 폰트크기 : ctrl + shift + +/- 
2. 전체화면 : 클래스명 탭(ex.*Hello.java) 더블클릭 
3. 자동완성 : 코드요약 + ctrl + space (ex. "syso"작성 + ctrl + space = System.out.println();)
4. 주석지정 : 영역지정+ctrl+shift+/
5. 주석해제 : 영역지정+ctrl+shift+\ (역슬래시)
6. 코드정렬 : ctrl+shift+F
7. 한줄끝으로 가기 : [end]
8. 들여쓰기 : tab / 내어쓰기 : shift+tab
9. 클래스 내 변수 확인 : ctrl + 코드명
10. import 클래스위치 자동입력/삭제 : ctrl+shift+o
11. 도움말 보는 방법(JRE라이브러리 확인) : " "드래그 + F4
12. 변수명 쉽게 바꾸는 단축키 ctrl+1

이클립스 환경 설정하기
1. 폰트 글꼴 바꾸기 - 언어마다 글자 너비 다름
  [1] Colors and Fonts의 Text Edit 열기 
      : Window>Preferences>General>Apperance>Colors and Fonts>Basic>Text Font>[Edit]
  [2] 00체로 끝나는 글꼴로 설정 후 [확인] 선택
  [3] [Apply and Close]
2. 도구창 보고 끄기 : Windows>Show View

 

 

3. 자바의 동작 원리

 

(1) 소스와 프로그램이란?

    가. 소스(Source) : 원천, 원인이라는 의미

     = 기호, 부호라는 의미에서 코드로도 부름

     = 의미를 전달하는 약속이라는 의미로 언어로도 부름

    나. (Application) : 소스코드로 작성한 결과물

     = 프로그램

 

(2) 자바 소스가 프로그램으로서 동작하는 과정

JDK가 소스코드 컴파일링 -> JVM이 OS(ex.window)에 맞게 실행코드 실행 -> 컴퓨터 화면

※ 왜 자바는 컴퓨터공학에서 배운 C언어와 다르게 컴파일 후 컴퓨터로 바로 실행하지 않고, JVM을 사용해서 컴파일을 하고 실행을 할까?

-- 참조 : https://jaeseongdev.github.io/development/2021/03/08/%EC%9E%90%EB%B0%94%EC%9D%98_%EA%B0%80%EC%9E%A5_%ED%81%B0_%EC%9E%A5%EC%A0%90_%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%97%90_%EB%8F%85%EB%A6%BD%EC%A0%81%EC%9D%B4%EB%8B%A4/

 

자바의 가장 큰 장점 - 운영체제에 독립적이다.[WORA(Write Once, Run Anywhere)]

Java의 JVM WORA(Write Once Run Anywhere)에 대해서 알아보자. WORA라는 개념이 탄생하게 된 배경부터, 왜 JVM의 WORA가 혁신적인지 과거의 이야기부터 차근차근 살펴보자.

jaeseongdev.github.io

 

 

4. 자바의 특징

- 참조 : [JAVA의 정석], 남궁성 지음

(1) 운영체제에 독립적이다. 

: 자바 프로그램은 JVM을 통해서만 통신하여, 어느 운영체제이던 독립적이지만, 그만큼 운영체제에 종속적이다.

(2) 객체지향언어이다.

(3) 비교적 배우기 쉽다

(4) 자동 메모리 관리 

: 가비지 컬렉터가 있어 자동적으로 메모리를 관리해준다.

pf. C언어의 경우 포인터와 malloc을 통해 힙 메모리 공간을 할당한 후, free()하여 메모리 할당을 해제했다.

(5) 네트워크와 분산처리를 지원한다. 

(6) 멀티쓰레드를 지원한다.

(7) 동적 로딩을 지원한다.

: 여러개의 클래스로 되어 있어, 필요한 시점에 특정 클래스만 컴파일링 하거나 특정 클래스를 호출할 수 있다.

 

 

5. 자바로 만들 수 있는 것들

 

(1) JavaEE를 활용해 웹 작업 가능

(2) 안드로이드 앱 만들기

- android development document 를 구글에 검색해서 Android 프로젝트를 만드는 법을 읽자

- android studio 툴을 통해 앱을 쉽게 만들 수 있다.

- android studio 에서는 자바 언어 또는 코틀린을 통해 소스코드를 작성할 수 있음

(3) 하둡을 활용해 빅데이터 작업 가능

(4) 사물인터넷 (IoT, Inter of Things)

- 컴퓨터는 시대가 바뀌면서, FAST/CHEAP/SMALL 세가지 특성을 가지고 진화해왔다.

- 사물 인터넷은 전구, 커튼, 전동자전거 등에 내장된 진화된 작은 컴퓨터와 그를 제어하는 프로그램을 일컫는다.

- 라즈베리파이 : 교육용 소형 컴퓨터 

- 자바를 통해 사물인터넷 프로그램을 만들 수 있다.

 

 

 

[참조]

- 블로그 (링크는 위에 있음)

- [자바의 정석], 남궁성 지음

- 생활코딩, 부스트코스

- 그 외 국비지원과정 수업 내용 참조

1. 자바란?

- 1991년 제임스 고슬링에 의해 만들어진 객체 지향 프로그래밍 언어

- '한 번 작성하면 어디서든 실행된다'는 목표를 가지고 만들어졌다.

[※ 참고하기 객체지향과 절차지향이란?]

(1) 절차지향(PP, procedure programming) : 하나씩 절차에 따라 코드를 작성하는 것 (순서대로 쓰는)
    - 절차지향은 "순서"에 따라 "데이터"를 어떻게 입출력할 건지 고려하여 코드를 작성한다.
    - C언어의 경우, 절차지향언어로 잘 알려져 있는데, 
      C언어는 3세대 컴파일러 언어로, 한 번 컴파일을 하면 그 자체를 컴퓨터가 통으로 읽는다. 
      그렇기에 소스코드도 #include, 프로토타입을 선두에 먼저 쓰고, 차곡차곡 코드를 작성해준다.

(2) 객체지향(OOP, object oriented programming) : 객체(속성+기능)을 꺼내 쓰는 것(골라쓰는)
    - 객체지향은 절차지향과 다르게 속성과 기능들을 하나로 묶어서 객체로 만든다. 
    - 과거 우주항공이 발달되던 시절, 
      실제 세계는 여러 객체가 서로 상호작용하며, 
      각 객체 내에는 자신 고유의 속성과 기능이 존재한다는 것을 알고 객체지향언어를 만들어냈다.
   
(3) 절차지향언어와 객체지향언어는 대립된 관계가 아니다.
    - 자바를 쓰더라도 절차적으로 코드를 짤 수 있다.


2. JDK,JRE 설치하기(운영체제별로 상이)

 

[설치 순서 요약]

[1] 내 컴퓨터의 운영체제 사양 확인(32bit or 64bit)
[2] JDK, JRE 설치 (Oracle에서 JDK installer를 설치하면 JRE도 같이 설치된다)
[3] 시스템 환경변수 설정하기

 

(1) 내 컴퓨터의 운영체제 사양 확인(32bit or 64bit)

- 내 컴퓨터 > 내PC > (우측마우스) 속성

 

 

 

 

 

 

 

 

 

 

 

 

- 장치사양 > 시스템 종류 확인 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2) JDK, JRE 설치

- Oracle JDK 설치파일 다운로드 링크 : Oracle,  https://www.oracle.com/java/technologies/downloads/

- 위 링크는 영어다. 어려우니 페이지에서 설치파일 찾는법을 적어보았다.

  [0] java 버전을 먼저 고른다. - java 8, java 11, java 17....

     (현장에서는 java 8이 자주 쓰이므로 java8을 다운하는 것이 좋다 한다..) 

  [1] 운영체제 탭(Linux/macOS/Windows)에서 내 컴퓨터의 운영체제를 선택(ex. windows)한다.

  [2] 운영체제 크기(32bit or 64bit)에 따라 파일 다운로드 

      * Compressed Archive = 압축 버전

      * Installer = 설치 
        // 아래 이미지에 형광색 표시는 Compressed에 했는데, Installer로 설치하면 된다.

 

[ ※ 참조하기 : JDK,JRE,JVM은 뭐고, 왜 JDK는 운영체제마다 설치파일이 다를까? ]

(1) JDK,JRE,JVM이란?
- java언어는 '한 번 실행하면 어디서든 작동'되기 위해 만들어진 언어이다. 그렇기에 java언어 자체는 어느 운영체제이건 독립적으로 작동하는 것이 맞다. 
- JDK는 개발자를 위해 만들어진 개발용 키트다. 우린 JDK를 통해 컴파일을 할 수 있고, 개발툴을 사용할 수 있다.
- JRE는 자바 런타임 환경을 말하는 것으로, JDK를 설치할 때 같이 설치되며, 여러 라이브러리와 각종 파일을 담고 있다.
  (사용자용은 JRE만 별도로 설치 가능)
- JVM은 자바 가상 머신을 말하는 것으로, 이 JVM이 JDK의 심장이며, 프로그램을 운영체제에 맞게 실행하는 역할을 한다.
- JDK 설치파일이 운영체제마다 달랐던 이유는, 각 운영체제에 맞춰 이 jdk가 각각 조금씩 달랐기 때문이다.
  (쉽게 말해 이렇다. 초콜릿을 만들 때, 같은 카카오 재료(자바)를 쓰더라도, 중간에 어떤 공정과정(각 운영체제별 JDK)을 거치느냐에 따라 단짠이 좋은 이(Windows)에게 맞을 수 있고, 아니면 쌉쌀한 쓴맛이 좋은 이(Unix)에게 맞을 수도 있다.)
* 참고 이미지 출처 : https://codevang.tistory.com/86



(2) JDK/JRE의 JVM이 작동되는 과정
- 가정 : 개발자가 컴퓨터에서 프로그램 1,2,3...을 개발했다.

- 개발 중>
  JDK에서 각각의 프로그램에 대해 컴파일링
  **컴파일 시 문자의 인코딩도 함께 이루어진다.
  **java -encoding utf-8 hello.java : java언어로 작성한 소스코드의 문자를 jdk가 컴파일 시 UTF-8 형식으로 인코딩

- 실행 시>
  프로그램 1,2,3... 각각 실행 시, 컴퓨터 내 JRE에 따라서 JVM 1,2,3... 이 각각 형성되어 구동


(3) 운영체제에서 명령어를 작성해서 자바가 잘 설치되었는지 확인하는 방법

: java -version, javac -version 을 작성해서 자바가 잘 설치되었는지 확인 

 

3. 시스템 환경 설정하기

※ 참조 : https://whitegom.tistory.com/3

 

(1) [시스템 속성]에서 [환경변수]창 열기

- 환경 설정 접근 경로1 : 제어판>시스템및보안>시스템>고급시스템설정>고급>환경변수

- 환경 설정 접근 경로2 : 윈도우 탐색기 > "시스템 환경 변수 편집" 검색>고급>환경변수

 

(2) JAVA_HOME 변수값 만들기

[1] [새로 만들기]를 누르고 

[2] 변수명을 JAVA_HOME으로 한 뒤, java.exe와 javac.exe 위치의 상위 폴더 경로를 입력

[3] [확인]을 누른다.

[※ 여기서 잠깐! ~~~에 대한 사용자변수(U)와, 시스템 변수(S)는 뭘까?]
- 컴퓨터를 쓸 때, 같은 운영체제 내에서 사용자가 여러명이 있을 수 있다.
- 지금 여기에서의 특정 사용자를 위한 변수를 사용자변수라 하고, 모든 사용자를 위한 공통 변수를 시스템 변수라 한다.

 

(3) PATH에 자바 설치 위치 입력하기

[1] Path를 더블클릭
[2] java.exe와 javac.exe가 있는 폴더경로까지 입력 // %JAVA_HOME%\bin

 

 

4. 시스템 환경 설정이 잘 되었는지 확인하기

(1) JAVA_HOME 변수가 잘 입력되었는지 확인 -- 명령인자 echo 사용 (상세 경로 출력)

 

(2) path가 잘 설정되었는지 확인 -- path 입력 또는, java/javac입력

▼ cmd에 path를 입력하니, 아래와 같이 java.exe이 설치된 경로가 나타난다.

▼ cmd에 java를 입력하니, 아래와 같이 나온다.

   - path가 잘 설정되지 않으면, "내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다"가 뜬다.

 

 

5. 시스템 환경 설정에서 "클래스 환경 변수" 추가하기

(1) 클래스 환경 변수 --  CLASSPATH = .   //내 프로그램을 기준으로 다른 클래스를 참조하겠다.

     .  : 현재 경로
     .. : 상위 경로

 

[※ 참고하기 : cmd에서 위치 이동하는법 [cd] 사용]

경로를 이동해보자

     .  : 현재 경로
     .. : 상위 경로
     \ : 이 드라이브의 맨 앞
    cd : change directory

 

[※ 참고하기 : 시스템 환경 설정을 왜 해야할까?]

- cmd의 default 경로 : C드라이브>사용자(user)>현재사용자명

- JDK을 다운로드하면 보통 C드라이브>programe files>java에 파일들이 설치된다. 
- 그러나 앞서 말했듯 cmd의 default위치는 user명이고, 우리가 저장할 소스코드는 컴퓨터 내에 어디에든 있을 수 있다.
- 컴퓨터는 바보라, path 지정 없이는 컴파일하는 javac.exe나, 실행하는 java.exe의 위치를 명시해야 그게 뭔줄 알고 작업을 한다.
▼ path 설정을 안 하면, 아래처럼 "  "안에 javac.exe의 상위 경로를 모두 치고 + .java를 해야 컴파일이 된다.


- 이렇기 때문에, 컴퓨터의 어느 위치에 있더라도, java.exe와 javac.exe가 접근할 수 있게 구태여 path 설정을 해준 것이다.

 

 

+ Recent posts