bin : 클래스만 들어가는 폴더
src : 소스가 들어가는 폴더
IDE에서 이 부분을 나누는 이유는 협업 도중 소스와 실행 파일을 구분(분리)하여 공유하기 위함이다.
자바SE : 스탠다드 에디션
자바JE :
자바JME :마이크로환경(모바일 환경) : 유행 못 타서 줄어들음
백엔드 쪽은 자바가 많음, 나라에서는 4차산업 관련 지원이 많은데 실제 취업은 불리함
파이썬가지고 취업하기는 조금 어렵다.
자바 하는 동안 워크스페이스는 자바 워크스페이스 만들거고 3일동안 스타트캠프는 따로 워크스페이스를 만들어 넘버링한다.
utf8 인코딩 설정 필요, utf8 설정 방식
new project하면 왜 java가 없을까? enterprise edition은 웹 버전이기 때문에 자바가 기본에 없다. UI를 구성하는 것을 뷰라고 하는데 현재 상태는 Enterprise를 구성하기 좋은 상태이다.
우상단 퀵어세스 옆칸을 선택하여 자바를 위한 뷰로 변경한다.
뷰가 최적화 된 상태임을 알 수 있다.
또한, 윈도우 창에서 하단 뷰를 추가할 수 있다.
이클립스는 현장에서 20년 된 IDE이므로 해당 기본 지식은 도움이 될 수 있다.
project layout 설정이 사담에서 설명했던 src와 bin의 분리를 결정하는 요소이다.
소스 폴더는 bin에, 스크립트는 src에 저장된다.
소스 폴더는 추가될 수 있다. 예를 들어 A라는 소스 폴더는 폴더 안에 들어가면 전부 해결되지만 협업 및 편의성을 위해 폴더를 분리해놓았다.
bin 폴더가 보이지 않는 이유? : 어차피 bin은 이클립스에서 관리하니 볼 필요가 없음.
encoding-prj
-> src - day01 - test01.java
-> resources(외부 파일 추가) - a.xml(추가됨)
-> bin
이런 상태라면, bin 폴더 안에는 다음과 같이 정리된다.
bin
->day01 - test01.class
->a.xml
즉 src는 .java / bin은 실행 파일이 주로 저장된다
encoding-prj
-> src - day01 - test01.java
-> resources(외부 파일 추가) - a.xml(추가됨)
-> data - b.xml (만약 이 폴더가 추가된다면? 소스 폴더가 아님)
-> bin
b.xml은 bin에 추가되지 않는다. 소스 폴더가 아니기 때문.
이클립스에서 소스 파일은 십자 마크로 확인할 수 있다.
data 파일은 적용되지 않고, 나머지 파일은 적용된다.
소스 파일은 다음과 같이 선언한다. 결과물은 bin에 적용된다.
다음은 예시와 같이 class를 선언한 상태이다. properties의 encoding 상태를 보면 MS949로 인코딩되어있다. 이를 전체적으로 바꾸려면 어떻게 해야 할까?
windows - preferences - encoding 검색
해당 설정은 workspace 전체의 설정을 바꾼다.
이 점의 문제점은 워크스페이스마다 설정을 해줘야 한다는 점이다.
더욱 편한 설정을 위해 이클립스 자체에 옵션을 적용해준다면 더욱 편할 것이다. mac같은 경우 기본으로 적용되어 있다.
우리가 워크스페이스에 저장한 데이터는 .metadata 폴더에 저장된다.
이클립스가 먹통일 경우 해당 폴더를 제거하면 설정이 초기화된다.
새 워크스페이스 적용 시마다 초기화된 상태임을 확인할 수 있다. 이러한 문제를 해결하기 위해 이클립스 자체에 옵션을 적용해야 한다.
이클립스 환경 설정은 당연하게도 이클립스 설치 폴더에 존재한다.
이클립스 ini파일을 열어 설정을 적용해보자.
-Dfile.encoding=UTF-8 (-D옵션명=값) 을 ini파일에 추가한다.
하지만 String 오타 등의 문제 발생으로 enum 개념을 도입하였다.
enum 선언 방식
다음과 같이 객체를 선언한다.
enum 역시도 스태틱 개념이 도입된다. 누군가의 클래스에 접근하기 위해서는 static 개념 필요.
객체 혹은 문법적 접근에 다음과 같은 모든 공식이 성립한다.
<자료형>
기본형 8개 (소문자로 시작) 숫자/문자/논리
숫자(6) --> 정수(4) 실수(2) : byte/short/int/long, float/double
문자(1) char
논리(1) boolean
자료형은 선언된 값이 그대로 저장된다.
<참조형(기본형 외의 모든 것)>
String s를 선언한다면 값을 저장하되,
값이 저장된 주소를 '참조'한다. 그렇기에 참조형을 그대로 print하면 주소가 나온다.
차이점이 보이는가? 누군가를 가리키는 참조와 기본을 구분할 줄 알아야 한다.
비슷한 의미로 class 역시 참조형이다.
int [] array; //참조형이기에 주소값을 찾아야 함.
System.out.println(array); //선언되지 않았기에 뭘 표현해야 할 지 몰라 에러가 뜸.
array = new int[3]; //주소값을 만드는 과정
}
만약 array에 null을 선언한다면 에러가 뜨지 않음.
int [] array = null; //참조형이기에 주소값을 찾아야 함.
System.out.println(array); //null 출력.
정리
int [] array = null;
System.out.println(array);
array = new int[3];
//1. array의 주소 선언 - new . 주소값을 통해 배열의 첫 인덱스로 진입 가능.
//저장된 위치(주소)는 오직 array에만 존재함.
//2. 크기 선언[3]
//3. int 기본형 값이 담김 int[]
array[0] = 1;
array[1] = 10;
array[2] = 100;
<>
추후 사진 참조.
배열은 생성과 동시에 자동초기화가 된다. 초기화값은 다음과 같다.
자동으로 초기화되는 배열 확인
1과 2의 차이점은 뭘까? VM 자동 선언 방법은 선언과 동시에 사용할 수 밖에 없다 라는 점이다. 값을 알고 있다면 두 번째 선언이 가장 편하다.
세 번째 방법은 변수를 수정 가능하다는 강점을 가진다. 이를 다음과 같이 사용할 수 있다.
배열 요소의 전반적인 내용을 확인하는 상황에서 단순 선언을 할 때, 한 번만 선언할 때 사용한다. (유일한 사용 방법)
현업에서는 배열을 거의 사용하지 않고 리스트 등을 사용하지만, 알고리즘에서 사용되기도 한다.
사진 참조
2차원 배열 역시도 초기화가 진행된다. 다음과 같은 결과값은 이렇게 나온다.
만약 선언되지 않은 배열의 경우 앞서 배운 것과 같이 null 값으로 표현된다.
이는 아직 선언되지 않은 크기이기에 널포인터 오류가 발생한 것이다.
만약 선언되었을 경우는 오류가 발생하기 않고 초기화가 발생한다.
package com.ssafy.startcamp;
import java.util.Arrays;
public class Test06_배열요소확인 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println("1.4까지 주로 사용");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("1.5버전에 추가된 향상된 for");
for (int i : arr) { //주의 : i는 0,1,2.. 등의 값이 아닌 실제로 arr에 들어간 값
System.out.println(i);
}
System.out.println("1.5버전에 추가된 Arrays.toString 활용");
System.out.println(Arrays.toString(arr)); //Array 값을 String화
System.out.println("1.8버전에 추가된 Arrays.stream을 활용한 배열 요소 확인");
//1.7까지는 객체만 지원했으나, 시간이 지나 함수형도 지원하게 되었음. 람다식 제공.
Arrays.stream(arr).forEach(v -> System.out.println(v)); //람다방식 1
System.out.println("Stream_2");
Arrays.stream(arr).forEach(System.out::println); //람다방식 2
}
}
배열 프린팅
혼자하는 빙고 : shorturl.at/DLSZ3
컴퓨터와 하는 빙고 : shorturl.at/fhioF
<추후 추가 예정>
package com.ssafy.startcamp;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Random;
public class Test07_빙고만들기 {
public static void main(String[] args) {
final int BINGO_NUM = 25;
Scanner sc = new Scanner(System.in);
String[] arr = makeBingo(BINGO_NUM); //초기 빙고판 만들기
System.out.println(Arrays.toString(arr));
while(true) {
printBingo(arr); //빙고판 콘솔창 띄우기
arr = changeBingo(arr,sc.nextInt()); //입력값으로 세팅하기
System.out.println(Arrays.toString(arr));
}
}
public static String[] makeBingo(int BINGO_NUM) {//랜덤 변수 빙고판 선언
String[] arr = new String[BINGO_NUM];
int[] numbers = new int [BINGO_NUM];
Random r = new Random();
for (int i = 0; i < numbers.length; i++) numbers[i] = i + 1; //numbers 배열에 1~ 빙고판 개수까지 생성
int idx = r.nextInt(BINGO_NUM); // idx : 랜덤 변수임
return arr;
}
public static void printBingo(String[] arr) {//빙고판 콘솔창 띄우기
int count = 0;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
count++;
if(count == 5) {
System.out.println();
count = 0;
}
}
System.out.println("번호를 입력하세요. ");
return;
}
public static String[] changeBingo(String arr[],int inputNum) {//입력값으로 세팅하기
for (int i = 0; i < arr.length; i++) {
if(Integer.valueOf(arr[i]) == inputNum) {
arr[i] = "*";
}
}
return arr;
}
}
[ 중복 제거 ]
static int[] lotto1() {
Random r = new Random(); //랜덤 클래스 생성
int[] lotto = new int[6];
lotto[0] = r.nextInt(45) + 1; //0 ~ 44, 나온 값에 +1하면 1~45 가능
outer: //반복문의 라벨을 붙임.
for (int i = 1; i < lotto.length; i++) {
int num = r.nextInt(45)+1;
for (int j = 0; j < i; j++) {
if (num == lotto[j]) continue outer; //해당 조건문일 경우 outer로 돌아옴.
}
lotto[i] = num;
}
return lotto;
}
static int[] lotto2() {
Random r = new Random(); //랜덤 클래스 생성
int[] lotto = new int[6];
boolean[] used = new boolean[46]; //초기화값 FALSE
for (int i = 0; i < lotto.length; i++) {
int num = r.nextInt(45)+1;
if (used[num]) {
--i;
continue;
}
used[num] = true; //사용 인덱스(값) 설정
lotto[i] = num;
}
return lotto;
static int[] lotto3() {
Random r = new Random();
int[] lotto = new int[6];
boolean[] used = new boolean[46];
int[] numbers = new int[46]; //int형 배열 추가
for (int i = 1; i < numbers.length; i++) { //1~45까지 값 설정
numbers[i] = i;
}
for (int i = 0; i < 1000; i++) { //1000번 섞기
int num = r.nextInt(45)+1;
int temp = numbers[r.nextInt(45)+1];
numbers[num] = numbers[1];
numbers[1] = temp;
}
for (int i = 1; i <= 6; i++) {
lotto[i-1] = numbers[i];
}
static int[] lotto4() {
int[] lotto = new int[6];
final int MAX_NUMBER = 45;
int[] numbers = new int[MAX_NUMBER];
for (int i = 0; i < MAX_NUMBER; i++) numbers[i] = i + 1;
Random r = new Random();
for (int i = 0; i < 6; i++) {
int idx = r.nextInt(MAX_NUMBER-i);
lotto[i] = numbers[idx];
numbers[idx] = numbers[MAX_NUMBER - i - 1];
}
return lotto;
}