본문 바로가기

Web Development/SIST

[Java] 1주차 수업: 2024.02.16 - 2024.02.23

2024.02.16

 

*JAVA

-하드웨어 기반 플랫폼=OS

-Java API: 자바에 미리 만들어져 있는 프로그램.. (e.g.System, println...)

-JVM:  brain 같은 역할. 바이트코드를 실행함.

JVM은 인터프리터 작업도 함. 인터프리터는 한줄 한줄 바로바로 번역하는 거라서 .class 파일이 안생김. JVM이 바이트코드를 각각의 OS에 맞게 번역함.

즉, 자바는 컴파일러, 인터프리터 작업 두가지를 다 함. (다른 언어는 하나만 하는 경우가 대부분)

Q. 자바는 왜 두가지를 다할까?

A. 자바는 OS에 독립적이라 윈도우에서도, 맥에서도 사용이 가능함. 이걸 가능하게 하려면 각각 OS에 JVM을 설치한 뒤에 각각 OS에 맞게 컴파일 해야함. 이렇게 두가지를 다 사용하는 방식으로 플랫폼 독립적으로 사용 가능.

 

(참고:

https://velog.io/@tsi0521/Java%EB%8A%94-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%99%80-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0-%EB%91%98-%EB%8B%A4-%EA%B0%80%EC%A7%84%EB%8B%A4

 

Java는 왜 컴파일러와 인터프리터 둘 다 가지는가?

1. 컴파일러 vs 인터프리터 컴파일러 & 인터프리터 모두 high-level language를 machine language로 번역한다 컴파일러는 소스 코드(high-level language로 작성) 전체를 링커등을 통해 한번에 번역하여 object file(

velog.io

)

 

-JDK(Java Development Kit) = JRE(Java Runtime Environment)를 포함. 디버거, 컴파일러 등이 추가되어 있음.

JDK 8, 11, 17 버전이 안정적으로 오래 지원되는 버전.

 

-이클립스는 파일을 만드는 즉시 컴파일 해주고, 파일을 저장할 때마다 컴파일 해줌.

 

 

 

2024.02.19

 

-식별자: 자바 코드 내에서 개발자가 사용한 이름 (e.g. 클래스 이름, 변수 이름, 메서드 이름...).

  숫자로 시작 불가. 영어 알파벳, 숫자, _, $만 사용 가능.

  상수 값을 표현하는 단어인 true, false, null은 사용 불가.

 

*기본자료형의 크기

자료형 키워드 크기 기본값 표현 범위
논리형 boolean 1byte false  true 또는 false (0과1로 대체할 수 없음)
문자형 char 2byte \u0000 0 ~ 65,535
정수형 byte 1byte 0 -128 ~ 127
  short 2byte 0 -32,768 ~ 32,767
  int 4byte 0 -2,147,483,648 ~ 2,147,483,647
  long 8byte 0 -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
실수형 float 4byte 0.0 -3.4E38 ~ + 3.4E38
  double 8byte 0.0 -1.7E308 ~ + 1.7E308

-정수에 별다른 자료형을 명시하지 않으면 int가 정수표현의 기본임.

(e.g. System.out.println(123);)

 마찬가지로, double이 실수표현의 기본이기 때문에 float 자료형도 9.1f 이런 식으로 float 형임을 명시해야 함

 

*확장 특수 출력 문자(escape sequence)

종류 의미
\a 경고음이 난다
\n 엔터 키의 기능을 갖는다. 줄을 바꾼다.(new line)
\t 수평 탭으로 일정한 간격을 띄운다.(tab)
\b 백스페이스로 뒤로 한 칸 후진한다.(backspace)
\r 동일한 줄의 맨 앞 칸으로 커서만 옮긴다(carriage return)
\f 출력 용지를 한 페이지 넘긴다.(form feed)
\\ \문자를 의미
\' '문자를 의미(single quote)
\" "문자를 의미(double quote)
\0 널문자를 의미(null)
\u16진수 16진수에 해당하는 유니코드

 

*형변환

-long 타입(8Byte)의 변수는 float 타입(4Byte)의 변수로 자동 형변환이 가능.

 그 이유는 메모리 설계상 정수인 long 타입보다 실수인 float 타입이 더 큰 범위의 수를 담을 수 있기 때문.

(즉 float 타입의 표현범위가 더 큼)

-32bit 미만의 자료형(byte형, short형) 데이터를 연산하면 자동으로 32bit로 변환됨.

 CPU는 4byte 연산만 가능하도록 설계되어 있기 때문

-float 데이터를 int 데이터로 강제형변환 하면 소수점 이하 자리가 절삭됨(반올림 X)

 

*연산자

종류 연산자 우선 순위
증감연산자 ++ , -- 1순위
산술연산자 +, -, *, /, % 2순위
시프트연산자 >>, >>>, << 3순위
비교연산자 >, <, >=, <=, ==, != 4순위
비트연산자 &, |, ^, ~ ~만 1순위, 나머지는 5순위
논리연산자 &&, ||, ! !만 1순위, 나머지는 6순위
조건(삼항)연산자 ?, : 7순위
대입연산자 =, +=, -=, *=, /=, %= 8순위

-전위 증감연산자와 후위 증감연산자

System.out.println(++i); // 메모리 공간에서 i를 1 증가시킨 다음 그 값을 읽어옴

System.out.println(i++); // 메모리 공간에서 i 값을 읽어온 다음 메모리 공간의 i를 1 증가시킴

System.out.println(i); // 메모리 공간에서 i가 증가된 것을 확인하기 위한 구문

 

 증감연산자를 변수명 뒤에 명시하면 변수 값을 우선 읽어온 후 값을 증감시킴.

 증감연산자를 변수명 앞에 명시하면 변수 값을 증감시킨 후에 그 값을 읽어옴.

 

 

2024.02.20

 

*논리연산자의 수행방식

연산자 설명
&& 선조건이 true일 때만 후조건을 실행하며 선조건이 false이면 후조건을 실행하지 않는다
|| 선조건이 true이면 후조건을 실행하지 않으며 선조건이 false일 때만 후조건을 실행한다

연산 속도를 빠르게 하기 위해 이렇게 동작함

/*

* 논리곱(&&)

* 선조건 && 후조건                      결과

*  true            true                         true

*  true            false                       false

*  false --> (후조건 미실행) --> false

*

* 논리합(||)

* 선조건 || 후조건                          결과

*  true --> (후조건 미실행) -->   true

*  false       true                             true

*  false       false                           false

*/



2024.02.21

 

-문자열은 참조 자료형이기 때문에 문자열을 비교할 때는 .equals()를 사용함

-System.exit(0);

 을 이용하면 프로그램을 종료할 수 있음

-nextLine()은 라인 전체를 다 받고,next()은 블랭크나 엔터 이전까지 받음

 

*while문

public class WhileMain05 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		int a, total = 0;
		
		System.out.println("0 전까지 입력받은 정수로 합 구하기");
		
		System.out.print("누적할 정수 데이터 입력: ");
		
		while ((a = input.nextInt()) != 0) {
			total += a;
			System.out.print("누적할 정수 데이터 입력: ");
		}
		
		System.out.println("누적된 정수의 합: " + total);
		
		input.close();
	}
}

-사용자 입력을 받아서 입력된 값이 0이면 누적 작업을 중단하는 프로그램.

 이 프로그램 "누적할 정수 데이터 입력" 라인을 두번이나 출력해야해서 다소 번거롭다.

--> 해결책

public class WhileMain06 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		int a, total = 0;
		System.out.println("0전까지 입력받은 정수로 합 구하기");
		
		while(true) {
			System.out.print("누적할 정수 입력: ");
			a = input.nextInt();
			
			if (a == 0)
				break;
			
			total += a;
		}
		
		System.out.println("누적된 정수의 합: " + total);
		
		
		input.close();
	}
}

 

-콘솔 프로그램을 만들 때에는 while문을 사용하여 메뉴 선택 방식으로 구현하는 것이 이상적임.

 

 

2024.02.22

 

*while문과 do-while문 비교

-while문: 조건비교에 만족 할 때에만 반복 처리하는 제어문. 선 비교, 후 처리

-do~while문: 조건비교에 불만족하다 할지라도 무조건 한번은 수행. 선 처리, 후 비교

 -> do~while문은 조건식을 검사하기 전에 무조건 실행 부분을 한 번 실행한다는 것이 차이

public class DoWhileMain {
	public static void main(String[] args) {
		int su = 0;
		String str = "Hello World!";
				
		// 선 처리, 후 비교
		do {
			System.out.println(str);
		} while(su++ < 5);
		System.out.println("---------------------");
		
		
		int su2 = 0;
		
		// 선 비교, 후 처리
		while(su2++ < 5) {
			System.out.println(str);
		}
		System.out.println("---------------------");
	}
}

 

-결과: whlie문은 5번 출력되고 do~while문은 6번 출력됨

 

*break

-다중반복문에서 break 사용:

  다중 반복문일 때 break를 사용하면 전체 반복문을 빠져나가는 것이 아니라 break가 포함되어 있는 반복문만 빠져나감

 

*break label

-한번에 다중반복문을 빠져나가고 싶을 때 사용 가능.

-빠져나가고 싶은 영역 위에

break_label: 문을 삽입하고

break문 뒤에 break_label; 을 삽입함.

-break_label문의 이름은 마음대로 지정 가능.

public class BreakMain03 {
	public static void main(String[] args) {
		// 다중반복문에서 break를 이용해서 모든 반복문 빠져나가기
		exit_for: // break label 지정
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 5; j++) {
				if (j == 3)
					break exit_for;

				System.out.println(i + ", " + j);
			}
		}
	}
}

 

*countinue

-특정 조건일 때 수행문의 실행을 멈추고 다음 반복 회차로 건너뜀

-반복문을 빠져나가지 않음

 

*배열

-같은 자료형들끼리 모아두는 하나의 묶음
-자바에서 하나의 배열은 하나의 객체로 인식

배열의 선언

char[] ch; 또는 char ch[];
배열의 생성

ch = new char[4];
배열의 초기화

ch[0]=‘J’; 
ch[1]=‘a’;
ch[2]=‘v’; 
ch[3]=‘a’;

-배열을 생성하면 참조변수 안에 배열의 주소가 보관됨

		// 배열의 선언 및 생성
		int[] it = new int[6];
		
		// 배열의 선언 및 생성(명시적 배열 생성), 초기화
		char[] ch2 = new char[] {'J', 'a', 'v', 'a'};
		
		// 배열의 선언 및 생성(암시적 배열 생성), 초기화
		char[] ch3 = {'J', 'a', 'v', 'a'};

 

-배열을 처음 생성할 때 초기화를 하지 않아도 기본 값으로 0이 들어가 있음 (<=> 변수와의 차이점)

-변수는 기본값이 정해져있지 않기 때문에 초기화를 하지 않으면 에러가 발생

-없는 인덱스를 호출하면 컴파일은 되지만 실행 시 오류 발생

 

*확장 for문

-배열을 위한 for문

-인덱스 i 변수를 생성하지 않고, 내부적으로 인덱싱을 하여 배열의 요소에 접근함

 -> 겉으로 인덱스 표시를 할 수 없음

		for (int num : array) {
			System.out.print(num + " ");
		}

 

*객체형 배열(e.g. String 배열)

-배열을 생성하면 배열 요소들이 null로 채워짐

 

*외부에서 데이터 전달하기(이클립스 이용)

우클릭 > Run as > Run configurations > 실행할 클래스 선택 > Arguments 클릭 >

Program arguments: 자바 오라클(구분자=공백) > Run

 

 

2024.02.23

 

*외부에서 데이터 전달하기

-main의 인자로 데이터를 전달하면 전달한 데이터의 자료형은 모두 String으로 인식

 -> + 연산이 되지 않고 문자열 연결이 됨

 

*String 데이터를 int로 변환하기

-Integer.parseInt() 함수 사용

 

*다차원 배열

-Java에서는 1차원배열은 굉장히 많이, 2차원 배열도 제법 사용하지만 3차원배열은 그렇게 많이 사용하지 않음 (C에 비해)

 -> 자바에서는 객체로 다차원 배열을 대체할 수 있기 때문에 다른 언어에 비해서는 1차원 배열 위주로 사용하는 경향.

-test = new int[2][3];

 행의 길이 = test.length

 열의 길이 = test[i].length

 

*배열의 크기

-배열은 한 번 크기를 지정하면 바꿀 수 없기 때문에 주어진 데이터를 사용하여 처리하는 경우가 많음

-부득이하게 배열의 크기를 늘려야 할 때에는 새롭게 더 큰 크기의 배열을 만들고 이전 배열에서 모든 자료를 복사해서 넣어주어야 함

-즉, 배열은 고정 길이

 

 

[클래스와 객체]

*클래스(class)

-건물을 지을 때 제일 먼저 필요로 하는 설계도면

 

*객체(Object): 설계도면을 통해 완성된 건물

-컴퓨터, 책상, 사람, 강아지 등 현실 세계에서 흔히 찾아볼 수 있는 대상을 모델링한 것 (메모리에 구체화시킨 것)

-물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것

-객체는 속성과 동작으로 구성

-속성 = 필드(field)

-동작 = 메서드(method)

 

*주소(Reference):  건물이 지어지면 건물에 주소(Reference)가 부여되고 주소를 통해 건물을 찾아갈 수 있음

 

*클래스의 구조

 

*객체의 생성 및 멤버 접근법

1) 객체 선언

-객체가 생성되면 객체의 주소를 보관할 변수를 할당하는 과정

Student s;

 

2) 객체 생성

-new 연산자를 사용하여 객체 생성을 희망하는 클래스의 생성자를 명시하고 메모리상에 객체를 생성

-객체가 생성되면 주소를 참조변수에 보관하고 원할 때 참조변수를 통해 객체에 접근할 수 있음

s = new Student();

 

3) 멤버 접근법

-참조변수에 저장된 객체의 주소를 통해 heap 영역에 생성된 객체의 멤버필드 또는 멤버 메서드를 호출

s.age = 21;