do~while 문을 배우고 생각해보니 do~while문은 써본 적이 거의 없는 것 같아서

익숙해질겸 이걸 이용해서 또 뭔가 만들어보려고 했다.

 

 

 

규칙

1~29 까지의 숫자가 랜덤으로 발생되고, 그게 뭔지 입력해서 맞추는 게임,

맞힐 때까지 반복되고, 내가 입력한 수보다 UP인지 DOWN 인지는 매번 알려준다.

 

 

 

깃허브

https://github.com/kindacool/etc/blob/main/MiniGame2.java

 

GitHub - kindacool/etc

Contribute to kindacool/etc development by creating an account on GitHub.

github.com

 

 

코드

package p2022_06_23;

import java.util.Scanner;

public class MiniGame2 {

	public static void main(String[] args) {

		// 1 ~ 29 까지의 숫자가 랜덤으로 발생되고 그게 뭔지 맞추기, 맞힐때까지 반복되고, 정답이 내가 입력한 숫자보다 UP인지 DOWN 인지 알려줌
		int number;
		int guess;
		number = (int) (Math.random() * 29); // 이게 숨겨진 정답

//	System.out.println(number);//난수 발생 확인
		do {
			// 값 입력받기
			System.out.println("1~29 사이의 수를 입력하세요.");
			Scanner sc = new Scanner(System.in);
			guess = sc.nextInt();
			
			if(number>guess) {
				System.out.println("UP");
			}
			if(number<guess) {
				System.out.println("DOWN");
			}
		}while(number!=guess);
		
		System.out.println("정답!");
		
	}

}

 

취업을 위한 CS 지식 공부도 할 겸

정보처리기사 자격증도 딸겸

해서 정보처리기사 실기 신청했다.

 

 

필기는 올해 1회에 붙고, 중간고사 때문에 실기 1회 못보다가

이번에 2022 정처기 실기 2회 신청함!

 

 

필기는 진짜 아무것도 아니고 실기가 어렵다는데

지금 국비지원 학원에 하루 12시간 쓰고 있고 영어학원도 다니고 있는데

어떻게 하지 ㅋㅋㅋㅋ 일단 지르고 보기

몰라 미래의 내가 하겠지~

 

 

공부할 시간 딱 한 달
한번에 붙어서 오겠습니당

 

 

 

중요 정보는 지웠습니다

 

과제

2022.06.22 / Hw1


      키보드로 3개의 정수를 입력 받았을때 최대값과
      최소값을 구하는 프로그램을 작성 하세요?
      (단, 조건 연산자를 활용해서 작성하세요.)

 

 

의도

Scanner 객체 사용해서 키보드로 입력받기

삼항연산자의 활용

 

 

깃허브

https://github.com/kindacool/Hw/blob/main/HW20220622/Hw1.java

 

GitHub - kindacool/Hw

Contribute to kindacool/Hw development by creating an account on GitHub.

github.com

 

 

코드

package p2022_06_22;

import java.util.Scanner;

public class Hw1 {

	public static void main(String[] args) {

		int n1, n2, n3, max, min;
		Scanner sc = new Scanner(System.in);
		n1 = sc.nextInt();
		n2 = sc.nextInt();
		n3 = sc.nextInt();

		// 내 풀이
		max = (n1 > n2) ? ((n1 > n3) ? n1 : n3) : ((n2 > n3) ? n2 : n3);
		min = (n1 < n2) ? ((n1 < n3) ? n1 : n3) : ((n2 < n3) ? n2 : n3);
		System.out.println("max = " + max);
		System.out.println("min = " + min);

		// 다른 방법으로 풀기
		max = (n1 > n2 && n1 > n3) ? (n1) : ((n2 > n3) ? n2 : n3);
		min = (n1 < n2 && n1 < n3) ? (n1) : ((n2 < n3) ? n2 : n3);
		System.out.println("max = " + max);
		System.out.println("min = " + min);

		// 강사님 풀이
		max = (n1 > n2) ? n1 : n2;
		max = (max > n3) ? max : n3;

		min = (n1 < n2) ? n1 : n2;
		min = (min < n3) ? min : n3;
		System.out.println("max = " + max);
		System.out.println("min = " + min);

		sc.close();
	
	}

}

 

 

자바 국비지원 2일차 수업 중 난수 발생시키기, 제어문 을 배우고 생각난

닌텐도 목장이야기 코로보쿠르 에서 여신님이랑 하는 미니게임을 그대로 만들어봤다!

연못에 공물을 10번 정도 주면 한번정도 게임시켜줬던 걸로 기억한다.

 

규칙

1. 여신님이 먼저 숫자 하나를 낸다.

2. 나는 '크다' 와 '작다' 중 하나를 고른다.

3. 여신님이 다음 숫자를 알려준다.

 

 

'크다'를 선택했을때,

3번의 다음 숫자가 1번의 이전 숫자보다 큰 경우 -> 정답

3번의 다음 숫자가 1번의 이전 숫자보다 작은 경우 -> 땡

3번의 다음 숫자가 1번의 이전 숫자와 같은 경우 -> 무승부

 

'작다'를 선택했을때,

3번의 다음 숫자가 1번의 이전 숫자보다 작은 경우 -> 정답

3번의 다음 숫자가 1번의 이전 숫자보다 큰 경우 -> 땡

3번의 다음 숫자가 1번의 이전 숫자와 같은 경우 -> 무승부

 

그리고 정답 과 무승부의 경우에는 한 판 더 게임을 할 수 있다.

그럼 이제 이 3번의 다음 숫자는 이전 숫자가 된다.

 

* 처음엔 좀 이해하기 힘들었던 게임이다.

 

 

ex)

여신님 : 자 그럼 이 8 보다?

나 : 작다

여신님 : 3

여신님 : 자 이전 숫자는 8 이고, 다음 숫자는 3이고, 너는 '작다' 를 선택했고 다음 숫자가 이전 숫자보다 작으니까...

여신님 : 정답!

여신님 : 자 그럼 이 3 보다?

나 : 작다

여신님 : 5

여신님 : 자 이전 숫자는 3이고, 다음 숫자는 5이고, 너는 '작다'를 선택했고 다음 숫자가 이전 숫자보다 크니까...

여신님 : 땡!

여신님 : 이번에는 1번만 맞췄구나

 

 

 

랜덤이지만 완전 랜덤은 아닌 게임,

여신님이 8을 주면, 다음 수는 0~7까지 거나 9 일테니 확률상 '작다' 를 선택해야 우승확률이 높아진다.

그렇게 해서 20번까지 맞은 적도 있었다. 뭐 이런게임이 있나 했지만 꽤 재미있음.

 

 

깃허브

https://github.com/kindacool/etc/blob/main/MiniGame.java

 

GitHub - kindacool/etc

Contribute to kindacool/etc development by creating an account on GitHub.

github.com

 

 

코드

package p2022_06_23;

import java.util.Scanner;

public class MiniGame {

	public static void main(String[] args) {

		// 목장이야기 코로보쿠르 여신님 퀴즈 : 0~9까지 수를 랜덤으로 해서 그 수보다 클지 작을지를 고르는 게임!
		int initValue; //초기값 , 이전값
		int nextRandom; //다음값
		int pick; //1을 고르면 크다, 2를 고르면 작다
		int score = 0; //몇번 맞췄는지 점수

		// 초기값도 랜덤으로(이전값)
		initValue = (int) (Math.random() * 10);

		while (true) {
			// 다음 값 (랜덤)

			nextRandom = (int) (Math.random() * 10);

			// 플레이어가 선택
			System.out.println("자 그럼 이 " + initValue + " 보다?");
			Scanner sc = new Scanner(System.in);
			pick = sc.nextInt(); // 1이면 크다! 2면 작다!

			System.out.println(nextRandom + " ~!");
			if (nextRandom > initValue) {

				if (pick == 1) // 다음값이 이전값보다 크다고 선택했으면
				{
					System.out.println("이전값이 " + initValue + "고, 이번값이 " + nextRandom + "이고, 다음값이 이전값보다 크다고 선택했으니까...");
					System.out.println("정답! 자 그럼 한번 더 할게.");
					score++;
					initValue = nextRandom;
				}

				else if (pick == 2) {
					System.out.println("이전값이 " + initValue + "고, 이번값이 " + nextRandom + "이고, 다음값이 이전값보다 작다고 선택했으니까...");
					System.out.println("땡!");
					break;
				}
			} else if (nextRandom < initValue) {

				if (pick == 1) // 다음값이 이전값보다 크다고 선택했으면
				{
					System.out.println("이전값이 " + initValue + "고, 이번값이 " + nextRandom + "이고, 다음값이 이전값보다 크다고 선택했으니까...");
					System.out.println("땡");
					break;
				} else if (pick == 2) {
					System.out.println("이전값이 " + initValue + "고, 이번값이 " + nextRandom + "이고, 다음값이 이전값보다 작다고 선택했으니까...");
					System.out.println("정답! 자 그럼 한번 더 할게.");
					score++;
					initValue = nextRandom;
				}

			} else {
				System.out.println("이전값이 " + initValue + "고, 이번값이 " + nextRandom + "이고, 다음값이 이전값보다 작다고 선택했으니까...");
				System.out.println("무승부!! 자 그럼 한번 더 할게.");
				initValue = nextRandom;
			}
		}
		System.out.println("이번엔  " + score + " 번 만큼이나 맞췄네 대단한걸?");

	}

}

변수 종류
1. 지역변수 (메소드 안에서 정의)
2. 멤버변수
3. 정적변수

메소드 호출
- 괄호, 괄호안의 변수가 기본자료형으로 되었을땐 Call by Value 로
- 클래스, 재열, 인터페이스면 주소를 넘기는 방식으로 호출 Call by Reference로

자료형 변환 3가지 방법
1. 기본 자료형 변환 : 기본자료형 변수들끼리 변환 ex)double <-> int
2. Wrapper 클래스를 이용한 자료형 변환 기본자료형과 참조형사이 변환 ex)int <-> String
3. 두 클래스사이에 상속이 전제되어야가능한 (업캐스팅, 다운캐스팅) 레퍼런스 형변환

자바 패키지
- java.io.* : 입출력관련 클래스를 모아둔 패키지 ex) BufferedReader, FileReader, FileWriter, File 등
- java.net.* : 소켓통신관련 패키지
- java.sql.* : 오라클,mysql등의 데이터베이스와 연동할때

*지금까지 만든 것들은 모두 괄호 안의 지역변수
ex) main 메소드 안에서 선언한 지역변수는 main 안에서만 사용가능

지역변수가 되기 위한 조건 
1. 메소드 안에서 정의되는 변수
- 메소드 안에서만 정의되어 사용되는 변수. 그 안을 벗어나는 순간 메모리에서 지워짐
- 스택이라는 메모리 영역에 저장된다.
2. 매개변수도 지역변수다.
- 메소드 괄호안에서 사용되는 변수
3. 블럭문(조건문 , 반복문)안에서 사용되는 변수도 지역변수다.

지역변수 특징
- 해당 메소드가 호출될때 스택 메모리에 할당되고, 메소드 실행이 종료되면 자동으로 메모리가 해제된다.

기본 자료형 변환 2가지


1. 묵시적 형변환(자동 형변환) :  컴파일러가 컴파일러하면서 자동으로 형변환 시켜준다.
- 작은 자료형 데이터를 큰 자료형 데이터로 형변환할때는 자동으로 변환해준다.
- int -> float 같은 4바이트지만 float형이 더 큰 자료형으로 인식된다. 그러므로 묵시적 형변환(자동) 된다.
- byte < short = char < int < long < float < double
- long 은 8 바이트, float은 4바이트지만 float(실수형) 이 더 큰걸로 취급된다.

2. 명시적 형변환(강제 형변환) : 컴파일러가 자동으로 변환시켜주지 않는다, 우리가 직접 강제로 형변환 시켜야함
ex) int -> char, char c = 97 일때는 오른쪽은 int이므로 자동으로 형변환 안됨 그러므로 char c = (char) 97; 해야함
ex) double -> int, int a = (int) 3.14 (오른쪽은 double 이므로 강제형변환해야)

패키지 추가
- 위에 1라인 좌측의 x를 더블클릭

아스키코드
- 문자는 내부적으로 아스키코드에 따른 숫자로 표현됨(십진수)
ex) 'a'를 int 형 자동 형변환 되면 출력하면 97이 나온다.

아스키코드 값
- 'A' : 65
- 'a' : 97

명시적 형변환(강제 형변환)
- 직접 변환 시키는것, 강제 형변환
- 큰 자료 데이터 -> 작은 자료 데이터 
- 괄호안에 왼쪽과 일치되는 자료형을 써준다.
ex) char c = (char)97; 
ex) int a = (int)3.14;
ex) random 메소드 쓰면 double형 데이터가 나옴 -> int로 강제 형변환

명시적 형변환 주의점
- int -> char 강제형변환하면 아스키코드 맞는 값 나온다.
- '형변환 과정에서 데이터 손실이 일어난다'
- float -> int : 소수점 이하를 '버림' (반올림 X)
- double -> float 강제형변환 : 소수점 길이가 긴상태에서 하면 짤림, 정확성이 보장되지 않는다.

+변수 선언
- int a = 10, b = 3, c; 이런식으로 int 변수 3개 생성 가능

연산자
- 언어 공통적으로 씀
- 변수와 변수사이 관계 연결할때 씀
- 산술연산자
- 비교연산자
- 조건연산자
- 논리연산자
- 대입연산자
- 증감연산자


산술연산자 : 산술적인 연산
+ , - , * , / , % (나머지)

산술연산자 주의1
- System.out.println("a / b = " + (a/b)); // 3(몫), 
- int와 int 연산이라서 같은 int형으로 출력되는거임. 3.333..아니라 3만 나옴.
- 기본자료형끼리만 산술적인연산이 가능
ex) String 클래스 와 기본자료형 끼리 결합시 "파이썬" + 50 하면 "파이썬50" 으로 '연산'이 아닌 '결합'된다

산술연산자 주의2

int n1, n2, n3, n4, n5, total;
double avg;

total = n1 + n2 + n3 + n4 + n5;
avg = total / 5;

 

- int형인 total과 int형인 5끼리 연산했으므로 결과는 int형으로서 뒤의 소숫점이 모두 잘리게 나온다. (정수로)

처리방법
1. avg = total / 5.0
- 5.0은 더블형이므로 소숫점이 짤리지 않는다.
2. avg = (double)total / (double)5;  
- 둘 중 하나만 double넣어도됨
- int와 double을 산술연산하면 double로 처리된다. (더 큰 자료형으로 처리된다.)

산술연산과 자료형
같은 자료형끼리 산술연산 -> 같은 자료형으로 결과가 처리된다
다른 자료형끼리 산술연산 -> 더 큰 자료형으로 결과가 처리된다.

문자열 연결/결합
- + 연산자

비교연산자 (=관계연산자) : 변수의 크기 비교해줌
- 값은 true / false
- if 문 조건식 만들때 많이 사용한다. ex) if(a == b) 나 if(a != b)
- > , >= , < , <= , == , !=
- char 끼리 비교 가능(문자가 아니라 내부 아스키코드 번호로 변환되어 비교)

참조형 변수의 비교
- 기본형 변수는 값을 저장하므로 값을 연산자로 비교 가능
- 참조형 변수들은 값을 저장하지 않기때문에 주의해야함
ex) String은 참조형 변수 중 '클래스' 중 하나

지역변수
- 지역변수는 "스택 영역"에 저장됨.

참조형 변수 (클래스, 배열, 인터페이스)
- String 클래스는 기본 자료형처럼 String s1 = "50" 문자열을 저장하는것처럼 보임
- but 메모리상에서 데이터 저장방식이 다르다.
- 값을 저장하는 영역과 그 영역의 주소값을 저장하는 영역이 따로 분리되어있다.
- 값은 힙에 , 주소값 저장하는 변수는 스택에 저장된다. 배열,인터페이스도 마찬가지이다.

 

참조형 변수의 비교 예시(String)
- 참조형은 값은 모두 힙이란 영역에 저장되고, 스택이란 메모리 영역에서 변수들이 값의 시작 주소값을 가지고 있다.
- s1, s2는 이 "자바"란 값을 가리키고 있다, 즉 주솟값을 가지고 있다.

String s1 = "자바" ; 
String s2 = new String("자바")


- 이 두가지 방식은 메모리상에서 처리되는데 차이가 있다(의미가 다르다)

* String 클래스만 값을 바로 저장해도 되고 new 를 통해서 String객체 생성하는 방식으로 
만들수도 있다.

String str1 = "자바";
String str2 = "자바"; 
String str3 = new String("자바");


1. str1, str2 처럼 기본 변수처럼 선언할땐,
- "자바"가 적힌 곳의 시작 주소값을 갖게 된다.
- str2 에 같은값인 "자바"를 할당하면 str2도 str1이 가리킨 같은 "자바" 를 같이 가리키게 됨. (새로운 공간을 만들지 않음)
- 즉 str1, str2는 같은 주소가 된다.

if(str1 == str2) {
System.out.println("같은 주소");
}else {
System.out.println("다른 주소");
}


출력 : 같은 주소

2. str3처럼 new 써서 객체를 만들어 선언할땐,
- new는 새로운 공간을 힙메모리에 만들어서 자바란 값을 저장하겠다는 의미!
- 그래서 힙메모리상에 "자바"를 새로 또 만들고 주솟값을 str3가 가진 형태로 된다.(그림참고)

if(str1 == str3) {
System.out.println("같은 주소");
}else {
System.out.println("다른 주소");
}


출력 : 다른 주소

 

그림

마우스로 그린거라..



참조형 변수의 비교 (값을 비교)
- 참조형은 주소값을 비교할 때 비교연산자를 써야하는 것이고
- 참조형들은 값을 비교하려면 비교연산자로 비교할 수 없다.
- equals 메소드를 사용해서

System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true


- 해야 값을 비교할 수 있다.

클래스로 입력받기
- 키보드 입력받기 위한 클래스가 여러개 있다.
- java.io 패키지 안 클래스로 입력받을땐 예외처리 해야한다.
- 여기선 일단 예외처리 필요없는  Scanner 객체 생성해서 입력받자 java.utility

Scanner sc = new Scanner(System.in); //Scanner.class 라는 바이트 코드 안에 있는 클래스/메소드

int n1 = sc.nextInt(); //첫번째 값과 두번째 값 구분은 스페이스바 or 엔터키로 구분함.
int n2 = sc.nextInt();


+ Scanner 쓸때 부분 입력과 동시에 import하는법 Ctrl + Space

클래스 구조 (api 문서)
- 클래스는 생성자, 메소드, 필드 가 있다
- 클래스로 객체를 만들때 생성자를 호출하게된다
- 생성자는 클래스와 동일한 명으로 되어있고 제공되는 것들만 쓸 수 있다. (제공되지 않은 생성자로는 불가능)
- 생성자는 메소드 형태로 되어있기 때문에 괄호가 반드시 있다 


Scanner 클래스 구조
- 라이브러리는 클래스형태로 되어있다 입력을받을때 쓰는 Scanner 클래스
- Scanner 객체 만들어서 사용한다.
- java.lang 패키지 안의 클래스 아니므로 import해야함

Scanner Class는 
java.lang.Object (부모)
     java.util.Scanner 

1. Scanner 생성자
- Scanner 중 매개변수가  InputStream source라고 되어있는거를 선택하여 입력받을 수 있다. 

Scanner(InputStream source)
Constructs a new Scanner that produces values scanned from the specified input stream.
- 우리는 생성자 중 이걸 쓴다.
- (InputStream source) 안에 System.in 이라고 쓴다(입력위해)
+ system 클래스 안에 in은 자료형이 InputStream

2. Scanner는 필드는 없다.

3. Scanner 메소드
nextInt() 메소드 : 키보드로 정수형태의 값 입력 받을때 쓰는 Scanner 안의 메소드
+ nextDouble(), nextInt() 등 자료형에 따라서 있다.
- nextInt() 메소드는 return형이 int형이다. 그래서 왼쪽도 int 변수가 와야함.
- nextDouble()오면 실수형으로 처리됨 (return형이 Double)
- nextLine() 오면 내가 10 와 20 입력해도 숫자가 아니라 문자로 처리됨 (return형이 String)

Scanner sc = new Scanner(System.in); 
//Scanner.class 라는 바이트 코드 안에 있는 클래스/메소드
//표준 입력받을땐 System.in을 생성자로
int n1 = sc.nextInt();
//첫번째로 정수를 받아서 n1에 저장하란 뜻

int n1 = sc.nextInt(); //첫번째 값과 두번째 값 구분은 스페이스바 or 엔터키로 구분함.
int n2 = sc.nextInt();


+ sc.nextInt() '객체'에 메소드! 이걸 int 형 변수에 저장
+ 파일로 부터 입력을 받을때 쓰는 생성자는 Scanner(File source) , Ctrl + Space 하면 볼 수 있다

조건 연산자
변수 = (조건식) ? 값1 : 값2;
- 조건식이 참이면 값1을 변수에 할당
- 조건식이 거짓이면 값2를 변수에 할당

+ 자바는 변수선언을 꼭 위에만 할수있는건 아니다

논리연산자 : ||, &&, ! ( 자바는 기호를 써야함)
- OR연산자 , AND 연산자, NOT 연산자
- 조건식이 2개 이상인 경우에 논리연산자(||, &&) 를 쓴다.
ex) if( a>b || a>c)
ex) if( a>b && a>c)

1. OR 연산자(||)
- 둘중 하나라도 True 가 있으면 True가 됨
- 둘다 False 여야만 False가 됨

2. AND 연산자(&&)
- 둘 다 true 인경우에만 true가 되고 나머지는 false가 됨

3. NOT 연산자(!)
- 기존 논리값을 반대로 바꿔줌
- true앞에 !가 오면 false가 되고 반대도 성립

확장 대입 연산자(= 복합 대입 연산자)
- 간결히 표기할때
- a += b; 는 a+b를 먼저 수행하고 결과를 a로 다시 할당 시켜란 의미

a+=b;	// a = a + b;
a-=b; 	// a = a - b;
a*=b; 	// a = a * b;
a/=b; 	// a = a / b;
a%=b;	// a = a % b;


증감 연산자
- (++) : 1씩 증가   

++a(선행 처리) // a=a+1;
a++(후행 처리) // a=a+1;


- (--) : 1씩 감소

--a(선행 처리)   // a=a-1;
a--(후행 처리)  // a=a-1;



증감 연산자 주의
- 변수명 앞에 오느냐 뒤에오느냐에 따라 다르다.
- ++가 앞에있으면 먼저 처리하고 그 줄을 넘어가라
- ++가 뒤에있으면 그 줄을 넘어가고 연산을 수행하라.

ex)

b= 10;
b1 = b++; // 후행 연산, 이 줄에선 b가 증가하지 않음.


출력 : b = 10, b1 = 11

 

자바의 제어문
1. 조건문(=선택문)
- if문
- switch~case문
2. 반복문
- for문
- while문
- do~while문
3. 보조제어문
- break문
- continue문

1. if문

    if(조건식){
         조건식이 참인경우 실행될 문장;
    }
   if(조건식){
         조건식이 참인경우 실행될 문장;
   }else{
         조건식이 거짓인경우 실행될 문장;
   }
   // 둘 중 하나는 반드시 실행됨

 

   if(조건식1){
          조건식1이 참인경우 실행될 문장;
   }else if(조건식2){
          조건식2가 참인경우 실행될 문장;
   }else{
          위의 조건식을 만족하지 않을때 실행될 문장;
   }
// 가장 먼저 해당하는 것의 문장을 실행하고 if문 전체를 나간다
// 딱 1개만 수행된다. 즉 위에서 조건이 참인걸 만나면 수행후 if를 나감, 밑으로 내려가지 않는다.

JAVA
웹, 앱을 만드는데 사용됨.

1. 객체 지향 언어이다. C++ JAVA C#
<-> 절차 지향 언어 : C언어, 변수와 함수의 위치가 중요함.
+ JAVA 는 C++과 다르게 클래스 다중상속 연산자 오버로딩 등은 지원안함.
2. 플랫폼에 독립적이다.
자바 가상 기계만 있다면 운영체제/하드웨어에 상관없이 자바 프로그램의 실행이 가능
3. 멀티쓰레드를 지원한다.
+ 동시에 여러 작업 수행할 때 ex)게임
4. 자동 메모리 관리 기능
5. 동적인 성능 확장의 제공

JAVA의 종류
- JAVA SE : 우리가 공부할 것, 스탠다드 에디션, PC용 애플리케이션 개발
- JAVA EE : 웹 애플리케이션 개발시 사용되는 자바 ex)JSP, Spring 개발시 사용
- JAVA ME : 휴대폰, PDA 등 모바일 환경에서 사용되는 자바

+ JAVA SE 를 설치시 2개의 프로그램이 설치됨.
1. JDK(자바 개발 키트) : 안에 컴파일러인 javac.exe, 자바가상머신인 java.exe 등이 포함되어 있다.
* 컴파일러 : 소스코드 -> 기계어 변환해줌
2. JRE(자바 런타임 환경) : 자바 실행환경 제공함, 클래스 형태의 라이브러리들을 묶은것이다.

자바 개발을 위한 통합 개발 환경(IDE)
1. 이클립스 (대표적 IDE)
2. IntelliJ IDEA

설치 다운 2가지 방법
1. Oracle 에서 JDK 설치하기 (8까지 무료, 라이센스 O) -주로 8 사용
2. OpenJDK 무료로 쓸수있는 JDK (라이센스 X) - 주로 11 이상 사용

JDK 안 bin 폴더 내부
- javac.exe : 컴파일러 프로그램
- java.exe : 자바 가상머신
*JDK 설치되면 bin안에 컴파일러와 자바 가상머신이 설치됨

+ JRE 안에 lib안의 rt 라는 패키지들이 압축된 파일도 있다.

JAVA를 설치 후 환경설정
bin 디렉토리까지의 PATH를 설정해야지만 위치와 상관없이 이 JDK안의 javac를 사용할 수 있다.
즉, cmd 명령프롬프트 창에서 컴파일을 하기위해서는 환경변수를 설정
1. JAVA_HOME : 환경변수 를 추가
2. 시스템 변수 중 PATH를 편집 %JAVA_HOME%\bin

JAVA가 실행되는 과정
1. 소스파일(.java)를 컴파일러가 기계어로 변환한다.
2. (.class) 바이트코드 파일이 생성된다.
3. 이 바이트코드를 자바 가상머신(JVM)이 실행해준다.

JAVA의 구조
- JAVA에선 class가 가장 큰 틀이고, 가장 먼저 class로 시작해야한다.
- 이 클래스명은 파일명과 반드시 같아야함 (자바만)
ex) Test class의 파일명은 Test.java
- 대소문자를 구분하여 코드를 작성해야함.

+ 메모장에 JAVA를 코딩할때
- ANSI 로 저장해야 한글 안깨진다.
- 메모장을 "Test.java"로 저장하자.

+ 메모장의 코드를 컴파일/실행할때
- javac Test.java // 컴파일, 바이트코드인 Test.class가 만들어짐
- java Test // JVM이 실행


JRE : 라이브러리를 묶어둔 클래스
- 자바에서 필요한 클래스를 import 해서 불러서 쓸때 필요하다.
(클래스 형태의 라이브러리로 제공딤)

JAVA 8 API Documentation : 이 JRE에 대한 설명서
API = 라이브러리 클래스
API 문서 = 라이브러리 클래스 설명서, 알파벳순 정렬
ex) String, System도 라이브러리 클래스임


IDE 프로그램 = 소스작성/컴파일/실행/디버깅 등 통합적으로 개발해주는 환경을 제공함
ex) 이클립스(무료), 인텔리제이(부분무료)

+ 이클립스는 다양한 플러그인을 지원함.
- JSP 가능, Spring,SpringBoot,C,C++ 등 관련 플러그인을 깔면 이런 언어들도 개발 가능하다.

이클립스 설치
1. Eclipse IDE for JAVA developers 버전을 설치시 자바 애플리케이션(내컴에서만 실행됨) 개발 가능
2. for JAVA EE Developers 버전을 설치시 JAVA 웹 애플리케이션 뿐 아니라 JSP. Spring 개발도 가능함
-> 우리는 JAVA EE Developers를 설치

기타
이클립스 2020-06는 자바 8까지 지원함
이클립스 2020-09 부터는 자바 11이상이 설치되어있어야만함
-> 이클립스 2020-06버전 사용할 것

- 워크스페이스 지정하기
- 프로젝트를 만들기 File - New - Java Project
- 인코딩 설정하기 Windows - Preference - encoding - UTF-8 로 통일 (한글 출력과 관련)
- 우측 상단 Perspective 눌러서 JAVA나 JAVA EE등 설정 가능 ex) JAVA EE 선택시 JSP, Spring등을 위한 메뉴로 바뀜

Project = 1개 폴더, 이 안에 클래스(.java)들을 넣는다
* JAVA 8 = 1.8로 나타남.
* (.class) 파일은 Project 폴더 밑 bin 디렉토리 가야 볼 수 있다. 이클립스에서 볼 수 없다.
* 소스파일과 바이트파일을 분리가능

- src폴더에 자바 소스파일(.java)를 넣는다
- Test라는 이름의 클래스 -> Test.java가 만들어짐
- 한개 클래스가 독립적으로 실행되기 위해 main 체크 해준다.

기타
컴파일 실행하는 법
- 상단의 실행버튼 (RUN) 누르면 컴파일 & 실행 해줌

글자크기 폰트 조절하는 법
Preferance - Appearance - Colors and Fonts
단축키 : Ctrl + '+' / '-'

초기 셋팅으로 돌아가기
Windows - Perspective - Reset Perspective

 

언어
- 고급언어 : C, C++, JAVA등
- 저급언어 : 어셈블리어 등

자바 특징
- 소스프로그램을 한번 작성하면 윈도우/리눅스/맥에서 다 실행가능
- 각 운영체제별로 자바 가상머신을 지원하기 때문임.
- 어떤 운영체제에서 개발되었든 운영체제에 맞는 바이트 코드로 실행됨(플랫폼의 독립)

자바언어의 특징
- 객체 지향 언어 : 부품 객체 먼저 만들고 조합
- 함수 스타일 코딩인 람다식도 지원
- 동적로딩,멀티스레드,오픈 라이브러리가 많음

정리
소스 작성 -> javac.exe로 컴파일 -> java.exe (각 운영체제의) 가 실행시켜줌)

주석 2가지
- // : 한줄주석 -> 그 줄 아무곳에서 단축키 Ctrl + /
- /* ~ */ : 블럭주석(다중행주석) -> 블럭 잡은 뒤 단축키 Ctrl + Shift + /

*문장끝은 ; 로 끝내기

클래스 Class
- 접근제어자/접근지정자 : 외부 클래스 접근 허용할지 안할지 public/default(없는상태)/protected/private 으로 지정
- 사용자정의 클래스 : 개발자가 만든 클래스 ex)우리가 만든 Test 클래스
*클래스명 = 파일명 , 대소문자 구분됨

메소드 : 코드의 묶음
- 메소드 코드 재사용 가능
- 메소드는 반드시 괄호를 가지고 있다


main 메소드
- 한개의 클래스 안의 main : 'main 메소드' 라고 부른다 (= 다른 언어의 '함수).
- main() 메소드는 자바가상머신(JVM,java.exe)이 가장 먼저 호출하는 메소드(개발자가 호출하는게 아님)이다.
- 하나만 있어야한다.
- main 메소드는 이름과 형식을 바꿀 수 없다.

* public static void main(String[] args){}
접근제어자/공유(static = 정적메소드) / 돌려줄값 / main메소드

바꿀 수 있는건 2가지
1. String[] args 의 [] 위치 바꿀 수 있다. (String args[]) 가능
2. args 대신 ar 이라고 바꿀 수 있다(String[] ar) 가능 (String ar[]) 가능, 즉 변수명 변경 가능
- main이 있어야만 독립적 실행가능하다
- main이 없으면 컴파일까지만 가능하고 실행은 안된다.

클래스(라이브러리)
- 입출력은 각 언어마다 제공되는 '클래스' 로 한다. scanf, input등
- 자바에선 system 클래스, io패키지, scanner등 (라이브러리로 제공되는 클래스)
- 이 system class는 JRE 안에 들어가있다.
- 이 라이브러리들도 class 형태로 되어있다. rt.jar (자르) 가 JRE안에 있다


패키지(package) : 관련있는 클래스를 묶어 놓은것

jar : 자바에서 사용하는 압축 클래스(여러 클래스를 묶어둔)
* rt.jar안에 몇십개의 패키지, 클래스가 있다.

- java.lnag 패키지 : 자바에서 가장 사용빈도 높은 패키지, 기본 패키지
- java.lang라는 패키지 안에 system 클래스 , String 클래스
ex) java.lang.String, java.lang.System, java.lang.Integer

- 라이브러리 형태로 제공된 패키지임
- 이 라이브러리들을 묶어놓은 것들이 JRE
- 이 클래스를 import해서 불러와서 쓰는것임
- java.lang 외의 모든 패키지는 import해야함. import 생략가능한 기본패키지 = java.lang
- 나머지 패키지는 무조건 import해야함.

정리
가장 간단한 예제 만들더라도 java.lang 패키지 안의 String 클래스 쓰고 있는것임
이 클래스는 기계어라서 이거에 대한 설명서는 아까의 api 문서임
이 클래스가 어떻게 만들어졌는지 api문서 보면 알 수 있다.
이 클래스를 비슷한 기능끼리 묶어둔게 패키지임
java.lang 누르면 그 안의 클래스들 나온다. (가장 사용빈도 높은 클래스 묶은 패키지)

JAVA Api Documentation
클래스의 기본 요소 : 필드, 생성자, 메서드 (어떤 클래스는 뭐 하나 없을 수도 있다)

1. java.lang 패키지명 System 클래스명
Field 란에 있는 out/in/err 는?
- System 클래스는 static이 붙은 정적 클래스/필드이기 때에 생성하지 않고 .으로 불러서 out을 쓴다.
* 정적 필드는 따로 객체를 생성하지 않고 클래스명에 . 뒤에 붙여서 바로 사용
- System 클래스에 생성자는 없고 매서드는 있다.

ex) println은 메서드임 -> () 를 반드시 가지고 있다. println("")
println 대신 print 쓰면 줄을 바꿔주지 않는다.
out 앞 클래스의 PrintStream 클래스를 찾아가면 println 찾을 수 있다.

2. java.lang 패키지명 String 클래스명
- 필드, 생성자(construactor), 메소드 있다.
- 매일 쓰는 클래스임

api 문서 보면 부모 확인 가능.
상속관계까지 이미 다 형성됨, 위에 나온게 자기 부모
ex) java.lang.String

+ java.io.PrintStream 에 print 여러 종류가 있다. (매서드 오버로딩)

이클립스 실행하기 3가지 방법
1.RUN 초록버튼눌러서 실행
2.오른버튼 눌러서 Run As의 Jav Application 눌러서 실행가능
3. 단축키Ctrl+F11

이클립스 단축키
- 실행 : Ctrl + F11
- 한줄 주석(단일항 주석) : Ctrl + /
- 블럭 주석처리(다중행 주석) : Ctrl + Shift + /
- 블럭 주석풀기(다중행 주석) : Ctrl + Shift + \
- 정렬 : Ctrl + Shift + F
- (중요)복사: Ctrl + Alt + 아래 방향키 - 아래방향으로 복사일어남
- 한줄 삭제 : Ctrl + D
- 이동 : Alt + 방향키(위아래) - 그 줄이 위 아래로 이동함. 자리바꿀때 유용
- 자동 import : Ctrl + Shift + O(영문)


자동 import
Date 클래스는 여러 패키지 안에 들어가있기 때문에 패키지 선택해야

실습

Random r = new Random();
System.out.println(r.nextInt(10)); //정수형태. 0부터 9까지의 난수발생 0부터 n-1까지



JAVA 의 변수
- 모든 언어는 변수, 함수(메소드)가 있다.
- 한번 더 사용하기 위해 메모리 상에 저장시켜두는 것.
- 즉, 메모리상 기억공간의 이름

변수의 선언(만들기) 방법
- 자료형 변수명 ; 으로 선언한다

변수명의 규칙
-변수의 첫글자는 문자, $, _ 여야 가능함.
- 숫자,@로 시작할수 없다.
- 변수명은 대소문자를 구분한다
- 영문 소문자로 시작하고 다른 단어 붙을때는 두번째 단어의 첫자를 대문자로 (낙타)
- 문자수 길이 제한없고 예약어는 사용불가

변수 예시

int score;
score = 90;


- 정수형 공간 만든뒤 90 넣어라는 의미

 

변수 특징
- 초기화 동시에할수도 있고 따로 할 수도 있다
- 변수는 값을 계속 바꿀 수 있다. Variable
- 처음할당되는 값은 초기값

자바 자료형
- 기본자료형
- 참조형 (클래스,배열,인터페이스)

자바의 기본 자료형
1. 정수 (byte 1byte, short 2byte, int 4byte, long 8byte)
2. 실수 (float 4byte, double 8byte)
3. 문자 (char 2byte)
4. 논리 (boolean 1byte)

1. 정수형
- 넘치면 오버플로우 적으면(-값크면) 언더플로우 이 범위 확인
- 보통 int 형 쓰지만 넘치는 경우만 long 형을 쓴다.
- int는 약 2의 32승까지 표기

2. 실수형
- float (정확성 떨어짐)
- double (실수는 보통 double 사용함) ex) double d = 3.5;

3. 문자형
- char는 2Byte(java에선)
- char c1 = 'k'
- char c2 = '안' // 반드시 외따옴표에 영문자든 한글이든 딱 한글자만 저장가능함(한글 한 syllable은 2바이트라 가능)
->그래서 잘 쓰지 않음 보통 String 클래스 쓰게 됨 나중엔

4. 논리형
- boolean 은 true false 값 저장 가능 (language마다 좀 다르다)

*기본자료형끼리 형변환 변경할때를 위해 크기를 기억해야
기본 자료형은 값을 저장(int는 정수값을 , double은 실수값을 boolean은 논리값을 저장)

기본자료형 외에 자바에선
참조형 이라는 자료형도 있다(Reference Type)
참조형 크게 3가지 있음
1. 클래스 ex) String s1 = "50";
- 대표적 자료형인 String 은 클래스형태의 자료형이다. String은 쌍따옴표 필수. 한글자뿐 아니라 여러 글자 저장
- char 처럼 일반적인 문자(값)를 저장하는게 아니라 "주소값을 저장한다!!!!"
- 값을 저장하는 곳과 주소값을 저장하는 곳이 분리되어있다.
2. 배열
3. 인터페이스

명명법
- 패키지명은 숫자로 시작 불가능하다.
- 클래스 명 첫글자는 대문자로 작성하는게 좋다.

JAVA는 , 가 아니라 +로 연결해야한다
ex) System.out.println("b1 = " + b1);

 

정리 & 실습

- 변수 : 메모리상에 데이터를 저장하기 위한 기억 공간
- 변수를 만드는 형식 : 1. 자료형 설정 2. 변수명 설정 3. = 값 설정
- 자료형 변수명 = 데이터(값);

 

기본 자료형 변수
1. 정수형 변수 (Byte, Short, Int, Long)

byte b1 = 10; //-128 ~ +127 까지의 정수값 저장
//byte b2 = 130; //오버플로우 발생
short s = 100; // -32768 ~ +32767
int i = 1000; // -21억 ~ +21억 정도, 10의 9이상은 int사용
long l = 100000L; //long형변수를 만들때 대문자 L을 사용해야함 long형이란 표시
		
System.out.println("b1 = " + b1);  // JAVA는 , 가 아니라 +로 연결해야
System.out.println("s = " + s);
System.out.println("i = " + i);
System.out.println("l = " + l);

2. 실수형 변수 (float, double)

float ft1 = 3.14f; 
float ft2 = 3.14F; 
// 3.14란 데이터는 내부적으로 double형으로 인식하기때문에
// 8바이트를 4바이트로 자동변환이 안되므로 오류가 생김. F나 f를 붙여야함

float ft3 = (float)3.14; //또는 형변환 시켜도 됨

double d = 42.195; //실수형은 주로 double형을 쓴다
			
System.out.println("ft1 = " + ft1);
System.out.println("ft2 = " + ft2);
System.out.println("d = " + d);

+ 소수점 자리 제어하는 법 / 줄바꾸기

- printf라는 함수를 사용해서 쉽게 제어

- printf("%.2f" 라는 서식문자 입력, 출력값) : 소수 둘째자리까지 출력하라는 의미,반올림한다
- \n으로 줄바꾸기

System.out.printf("%.1f\n" , d); 
System.out.printf("%.2f\n" , d);

3. 문자형 변수

- char는 C언어는 1바이트지만 java는 2바이트임, 영어든 한글이든 무조건 1글자만 외따옴표안에 저장가능 'ab'(x) 불가능

+ 문자 두글자 넣을수있는 자료형은? -> 기본자료형으로 불가능 -> 새로운 자료형(참조형)이 있다
+ String 클래스 문자 몇글자든 넣을 수 있고 "" 로, but 중요한건 메모리상에서 데이터를 저장하는 방법이 다름

char c1 = 'A';
char c2 = '안';
System.out.println("c1 = " + c1);
System.out.println("c2 = " + c2);

4. 논리형 변수

- 자료형과 일치되는 값을 적어야, 같다가 아니라 넣어라의 의미

boolean bn1 = true;
boolean bn2 = false;

System.out.println("bn1 = " + bn1);
System.out.println("bn2 = " + bn2);

 

참조형 변수

1. 클래스

- 대표적인 클래스 String

+ String 생성 첫번째 방법 : 스트링 객체를 생성한다.

String s1 = "자바";

+ String 생성 두번째 방법 : new 연산자 써서 만든다.

String s2 = new String("자바");

* String은 두가지 방법 모두가 가능한 유일한 클래스임.
* 다른 클래스는 거의 new 연산을 써야만 만들어진다.

System.out.println("s1 = " + s1); // 자바 라고 출력됨(주솟값 출력되진 않음)
System.out.println("s2 = " + s2); // 자바 라고 출력됨(주솟값 출력되진 않음)

+ 데이터는 힙영역에 저장되고 s2는 그 주소값을 가지고 있게 된다.

 

참조형 변수의 비교

- 주소값 비교할땐 비교연산자로 비교한다.

if(s1 == s2){ 
System.out.println("같은 주소");
}else {
System.out.println("다른 주소");
}

출력 : 다른 주소
- 데이터 (값) 비교할땐 이렇게 해야한다.

if(s1.equals(s2)) { 
System.out.println("같은 값");
}else {
System.out.println("다른 값");
}

 

2. 배열

- 동일한 자료형의 데이터를 저장하는 정적인 자료구조

- int[] : int형배열을 만들겠다, []개수가 한차원

int[] score = {80, 90, 100};
for(int j = 0 ; j <score.length ; j++)
{
System.out.println(score[j] + "\t");
}
System.out.println();

3. 인터페이스

- 대표적인 인터페이스 List

- 인터페이스는 new 연산자로 생상할 수 없다. 자체적으로 객체생성 불가능

+ List 특징
1. 순차적인 자료구조
2. 여러가지 자료형의 데이터를 저장할 수 있다. (배열과 다르게 여러 자료형 혼용가능)
3. 동적으로 공간의 크기를 늘릴 수 있다.

//List list = new List(); //인터페이스는 new 연산자로 생상할 수 없다. 자체적으로 객체생성 불가능
List list = new ArrayList();//자료형 변환 관련 '업캐스팅'이란 개념. 동적으로 계속 늘려줌

list.add(30);//정수값을 저장
list.add(3.14);//실수값을 저장
list.add('j');//문자값을 저장
list.add(true);//논리값을 저장
list.add("자바");//문자(열)값을 저장
		
for(int k = 0 ; k <list.size() ; k++) {
	System.out.print(list.get(k) + "\t");
}

 

+ Recent posts