JAVA/JAVA 수업

[JAVA] 21.05.18

샛별KIM 2021. 5. 20. 08:48

능력단위명 : 응용 SW 기초 기술 활용
능력단위요소 : 데이터베이스 기초 활용하기

 

* eclipse 자바프로젝트 생성 시 module은 꼭! don't create 해준다

* 만들 땐 자바 프로젝트 > class로 생성!

 

 

[데이터 타입]

/* 자바에서는 변수, 상수 값을 담기 위해서
 * 반드시 그 값의 타입에 맞는 변수를 사용해야 한다.
 * 이를 데이터 타입 이라고 한다.
 * 
 * 데이터 타입 2가지
 * Reference (참조타입)
 * Primitive (기본타입)
 * 
 * 자바의 데이터타입은 P와 R로 크게 두가지로 나뉜다.
 * 
 * 1. p타입은 수치형, 문자형, 논리형
 * 각각의 타입들은 메모리 크기가 엄격히 제한된다.
 * 
 * (1)수치형
 *  정수형
 * byte
 * short 
 * int (기본)
 * long
 *  실수형
 *  float
 *  double (기본)
 * 
 * (2)문자형 = 한 글자 = A, 가, 羅, $
 *  char
 * 
 * (3)논리형 = 참/거짓 = true or false 
 *  boolean
 */

 

<크기>

byte < short < int < long < float < double

long longNum = (long) pi; //크기와 상관 없이 실수를 더 크게 본다. 따라서 이것은 프로모션이 안됨

longNum = (long) fNum; //크기와 상관 없이 실수가 더 크기 때문에

 

<표식자>

longNum = 9223372036854775807L; //표식자. 숫자 뒤에 L을 붙이면 임시로 long타입으로 본다.

 

<데이터 타입의 캐스팅>

// 작은 타입과 큰 타입 계산시엔 기본 타입 이하이면 기본타입으로 변환, 계산된다
// 기본타입 이상일 경우에는 무조건 큰 타입으로 변환 후 계산된다.

 

byteNum = (byte) -13000; // byte는 -128~127, 넘어가면 다시 돌아감 (-128 다음은 127)

//타입이 = 를 기준 양쪽이 달라 대입이 안되니 억지로 (byte) 캐스팅해준다

byteNum = (byte) ((short) ((int) (longNum)));

float fNum = 3.14; 이렇게 하면 3.14를(기본)인 double로 보기 때문에 타입이 달라 오류!

 

<실수형>

/* 실수형
 * float과 double이 있음
 * double이 기본 타입이다.
 * float에 값을 실수로 초기화 할 때는 표식자(f, F)를 넣어줘야 한다.
 * (안 그러면 double을 넣는게 되어 컴파일 에러)
 * 이유는 실수 값 자체가 double 메모리로 만들어지기 때문에
 * float에 대입하는 것이 불가능
 * 
 * 주의2
 * 같은 값이라도 실수는 무조건 정수보다 큰 타입으로 인지
 * 또한 float은 4byte 라고 하더라도 long(8byte)보다 큰 타입으로 인지
 * 따라서 값을 대입할 때는 캐스팅 해야 한다. 
 * 
 * 
 */

 

<문자형>

//char 문자형
//문자 하나를 저장합니다.
/* 반드시 값으로는 문자 하나가 와야 합니다. a A 가 羅 ^
 * 하나 이상일 경우에는? String으로 저장
 * 정수형 타입 0~65,535 = 2byte 음수는 X
 * 
 * 문자형을 저장할 때는?
 * 반드시 홀따옴표로 
 * 
 * 정수형이기 때문에 int에 프로모션 가능
 * 반대로 int 값 또한 문자로 바뀔 수 있다. (cast)
 * 
 */

str = "" + char1 + char2 + char3; // ""를 빼면 char로 인식하지만 ""를 끼면 가장 큰 "", string을 기본타입으로~

 

 

<기본형식>

public class Hello{//클래스
 public static void main(String[] args) {//메소드
  int number = 10; //명령문장(변수 선언); 메소드 밖으로 나갈수 있음;
  System.out.print("Hello");//명령문장; 메소드 밖으로는 못나감
  //불러오기 = 호출 = 메소드 이름을 적어준다.
 print();
 }

}

 

<상수> : 모두 대문자로 표기
final int PAGE_NUMBER = 10;
//PAGE_NUMBER : 에러
final : 값 수정 불가. 고정된 값이므로 상수 앞에 붙여주세요

 

<변수> : var

/*
 * 변수를 사용하는 주 목적은 같은 타입(type)의 값이
 * 프로그램 실행 시 자주 변경되어야 할 때
 * 이를 변수에 담아서 활용하기 위함.
 * 변수는 정말 많이 사용됨.
 * 
 * 1. 변수의 선언(초기화) 규칙 (★★★★★)
 *  (1) 변수는 특정 블럭{중괄호} 내부 어디에서건 선언 가능
 *   만약 메소드 바디 내부에서 처음 선언되면 = 지역(local)변수
 *   클래스 바디 내에서 선언되면 = 객체(인스턴스) 변수

 *   ex. public class Variable {
 *          int number2; //인스턴스 변수
 *              public static void main(String[] args) { //main메소드
 *          int number, num1, num2; //변수선언 = 지역변수 
 * 
 * 2. 변수가 처음 선언되면 그 변수를 포함하고 있는 블럭 내에서
 *    절대로 재선언 불가능!! (★★★★★) 
 *   = 같은 이름으로 선언 불가, 이름이 겹칠 수 없음
 *  
 * 3. 변수가 처음 선언될때는 반드시 변수 좌측에
 *    변수의 타입(type) 일명 데이터 타입이 선언되어야 합니다.
 *    (데이터 타입은 변수 이후에..)
 * 
 * 4. 같은 타입의 변수는 한 라인에 ; 없이 계속 선언되어질 수 있으며
 *    , 로 구분하여 마지막 변수 끝에 ; 를 붙여줍니다.
 *    
 * 5. 지역변수는 반드시 사용 전에 값이 초기화 되어야 합니다!
 *  ?초기화는 값을 처음으로 넣는 것. 

 *  ex. int num = 1000; //변수선언 + 초기화
 */

 

<print문>

//문자열 + 문자열 ======== 연결
System.out.println("제 이름은 " + name + "입니다.");

//계산
System.out.println(10 + 10);

System.out.println("제 이름은 홍길동입니다.");

int age = 34;
//문자열 + 숫자 ======== 연결
System.out.println("제 나이는 " + age + "입니다.");

//숫자 + 문자열 =======연결
System.out.println(20 + "입니다.");

//숫자 + 숫자 + 문자열 ====== 계산 + 연결
System.out.println(20 + 10 + "입니다.");

//문자열 + 숫자 + 숫자 + 문자열
System.out.println("문자열" + age + 10 + "입니다."); // 출력 : 문자열3410입니다
//문자열 다음이면 무조건 문자로 연결한다고 생각하면 편함

System.out.println("문자열" + (age + 10) + "입니다.");

 

 

<캐스팅과 프로모션>

/* 캐스팅 / 캐스트
 * 큰 타입을 작은 타입에 대입할 때 반드시 해야 하는 연산
 * (type)을 명기해서 값을 대입시킨다.
 * 이때 주의할 점! ★★★
 * 상위 비트를 대입할 때 작은 타입에 맞게 잘라내기 때문에
 * 값의 변화가 올 수 있음!!! ★★★
 */

//프로모션
/* 큰 타입에 작은 타입이 대입되는 것
 * 작은 타입이 큰 타입에 자동으로 들어가는 것
 * 캐스팅의 반댓말!! 값 변화? 없음
 * 왜냐 byte타입은 short타입에 모두 들어갈 수 있으니까
 * 또, 양쪽 타입이 달라도 좌측에서 허용 범위일 경우 프로모션 가능
 * ex) byte bNum = 3 + 100; 에서 3+100은 int이지만 바이트에서 표현 가능!
 * 따라서 프로모션으로 (byte) 3 +100으로 들어간다
 */

 

int result = code % 2; //모듈러(%) = 나머지 값

 

<숙제>?
리터럴 이란?

MIN_VALUE = 0x80000000; 
MAX_VALUE = 0x7fffffff;

아스키 코드, 유니코드 표 
utf-8, euc-kr, ms949 

 

 

<번외>

sNum = 3+100일때 3+100은 무조건 기본타입인 int로 본다고 하셨는데
그럼 int값인 103이 더 작은 byte에 들어가려면
bNum = (byte) 3 +100; 이렇게 되어야 하는게 아닌가요??

SeungHyun YOON에서 나에게:  (DM) 02:53 PM
103은 바이트에서 표현할 수 있지요?
그럼 캐스팅 없이 들어가는것 = 프로모션이 되요

나에서 SeungHyun YOON에게:  (DM) 02:53 PM


SeungHyun YOON에서 나에게:  (DM) 02:53 PM
자신의 범위를 넘어갔다면 그때 캐스팅이 있어야 해요

나에서 SeungHyun YOON에게:  (DM) 02:55 PM
아하 양쪽 타입이 달라도 좌측에서 허용할수 있는 범위이면 프로모션이 되는건가요?? 감사합니다!! 이해됐어용 b

SeungHyun YOON에서 나에게:  (DM) 02:57 PM
감사합니다