1주차 목차
- 변수
- 정수
- 자료형
- 상수와 리터럴
- 자바의 연산자들
객체 간의 협력으로 이루어지는 프로그램 -> 객체지향 언어
모든 클래스는 패키지 안에 있는게 좋다 (command + n 으로 생성)
src - package(소문자 시작) - class(대문자 시작) public static void main(String[] args) 체크
command + d : 한 줄 지우기
동작시 command + s : 저장과 컴파일 동시에 (project - Build Automatically 체크)
자바 파일에 클래스 여러개 들어갈 수 있음. 대신, public으로 쓰인 클래스는 하나만
컴파일된 클래스 파일은 bin 폴더에 있음 (실제로 구동되는 곳)
main 함수는 구동을 위해 사용 (웹서버에서 돌아갈 때는 안쓰는 경우도 있음)
컴퓨터에서 자료 표현하기
package ch01; // ch01이라는 패키지 안의
public class Hellojava { // Hellojava라는 클래스
public static void main(String[] args) {
int num = 10;
int bNum = 0B1010; //0B -> 이진수
int oNum = 012; // 앞에 0 -> 8진수
int xNum = 0XA; // 0X -> 16진수
System.out.println();
System.out.println();
System.out.println();
System.out.println();
}
}
모두 10 출력
변수 (Variable)
- 변수마다 가지는 자료형(데이터 타입) 다르다
- 변수 이름은 특수 문자 $, _ 만 사용 가능, 영문자로 시작 (숫자 불가능)
- 가독성 좋게 의미를 알기 쉽게 쓰기
자료형 (data type)
- char - 2byte
- int - 4byte
- float - 4byte
정수형 자료형
- byte - 1byte (-128~127 까지 표현 가능)
- short - 2byte
- int - 4byte
- long - 8byte
int num = 10; 의 경우
num 이라는 4byte 상자가 만들어지고 여기에 10을 복사하는 개념
10은 리터럴 : 프로그램 안에서 쓰는 숫자, 문자, 문자열
long number = 12345678900L;
4byte안에 속하지 않는 큰 숫자인 경우
long으로 선언하고 숫자 뒤에 L 적음
기본적으로 정수로 숫자를 잡는데 L을 쓰면 long형으로 잡으란 의미
실수형 자료형
- float - 4byte
- double - 8byte (기본적으로 사용)
- 정밀도 차이
1.m X 2^-n -> 부동소수점 표현
1.m : 가수
2 : 밑수
-n : 지수
정규화 : 가수가 밑수보다 작은 한자리 까지 가수로 표현되는 것
package ch01;
public class DoubleTest {
public static void main(String[] args) {
double dnum = 3.14;
float fnum = 3.14f;
// 실수는 기본적으로 double형 사용
// float 사용시 실수 뒤에 f 쓰기
System.out.println(dnum);
System.out.println(fnum);
}
}
float 형은 소수점 이하 6자리 까지 오차가 발생하지 않고
double형은 소수점 이하 15자리까지 오차가 발생하지 않는다.
문자형 자료형
- 문자 세트 : 각 문자를 얼마로 표현할 것인지 코드값을 모아둔 것
- ex) 아스키 코드표, 유니코드
- 'A' -> 65 : 인코딩
- 'A' <- 65 : 디코딩
package ch01;
public class CharaterTest {
public static void main(String[] args) {
char ch1 = 'A';
System.out.println(ch1); // A 출력
System.out.println((int)ch1); // 65 출력
// (int)ch1을 통해 int형으로 강제 형변환
char ch2 = 66;
System.out.println(ch2); // B 출력, 66이 애초에 char로 선언되었기 때문
System.out.println((char)ch2); // B 출력
int ch3 = 67;
System.out.println((char)ch3); // C 출력
// int형을 char형으로 강제 형변환하여 67에 해당하는 문자가 출력됨
//char ch = -66; // 음수는 사용할 수 없다.
char han = '한';
char ch = '\uD55C'; // 아스키 유니코드 값으로 한이 출력됨
System.out.println(han);
System.out.println(ch);
}
}
논리형
- true / false
- 1byte
지역변수 자료형 추론
- 추론 가능한 변수에 대한 자료형을 선언하지 않음
- 한 번 선언하여 추론된 변수는 다른 타입의 값을 대입 할 수 없음
- 지역 변수만 사용 가능
지역변수
- 중괄호(블록) 안에서 사용하는 변수
- 함수의 매개변수, 즉, 파라미터로 사용하는 변수
package ch01;
public class CharaterTest {
public static void main(String[] args) {
var i = 10;
var j = 10.0;
var str = "hello";
System.out.println(i);
System.out.println(j);
System.out.println(str);
}
}
i의 타입은 int, j의 타입은 double, str의 타입은 string 처럼
너무 당연히 알 수 있는 자료형인 경우 타입을 굳이 안쓴다.
Java 버전 10부터 쓸 수 있다. properties에서 확인 가능
변하지 않는 상수와 리터럴, 변수의 형변환
- 변하지 않는 숫자들이 반복되어 프로그램에서 쓰일 때 상수로 선언해서 쓸 수 있다.
- 상수로 선언 할 때 앞에 final을 써서 상수 선언
- 선언과 동시에 대부분 초기화 (반드시는 아님)
- 보통 상수는 대문자로 많이 표현
상수를 사용하면 변하지 않는 값을 반복하여 사용할 대 의미있는 문자로 인식하기 쉽다.
혹, 변하더라도 선언한 부분만 변경하면 되므로 여러부분을 수정할 필요가 없다.
package ch01;
public class ConstantTest {
public static void main(String[] args) {
final int MAX_NUM = 100; // 상수 선언과 동시에 초기
final int MIN_NUM; // 상수를 선언만 하는 경
MIN_NUM = 0; // 상수는 반드시 값을 지정해야
// MAX_NUM = 20; 불가능 상수는 바뀔 수 없다.
System.out.println(MAX_NUM);
System.out.println(MIN_NUM);
}
}
리터럴 (literal)
- 프로그램에서 사용하는 숫자, 문자, 논리 값
- int num = 10; 에서 10이 리터럴
- 정수 리터럴은 int로 실수 리터럴은 double로 저장됨
- 따라서 다른 자료형을 쓸 경우 long은 리터럴 뒤에 L, float는 리터럴 뒤에 F를 써야함
숫자는 언제 메모리에 위치?
프로그램을 실행 시키면 하드디스크에 있는 프로그램이 메모리로 load가 된다.
이 load되는 시점에 프로그램 안에 있는 자료 중 일부는 메모리를 잡는다
실행이 되면서 메모리 할당받는 애들이 있고
실행과 상관없이 load된 순간 영역을 잡는 애들이 있다 (상수, static 변수)
이러한 자리 잡는 영역을 constant pool(data 영역)이라고 한다.
즉, 리터럴은 상수 풀 (constant pool)에 있고
프로그램이 실행이 끝나고 unload될 때 사라지게 된다.
형 변환 (type conversion)
서로 다른 자료형 간에 연상등의 수행을 위해 하나의 자료형으로 통일하는 것
묵시적 형 변환(자동 형 변환)과 명시적 형 변환(강제 형 변환)이 있다.
바이트 크기가 작은 자료형에서 큰 자료형으로 형변환은 자동으로 이루어 짐
덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환은 자동으로 이루어짐
자동 형 변환
package ch01;
public class TypeConversionTest {
public static void main(String[] args) {
byte bNum = 125;
int iNum = bNum; // 아무런 문제 없다.
System.out.println(iNum); // 잘 출력된다.
}
}
강제 형 변환
package ch01;
public class TypeConversionTest {
public static void main(String[] args) {
int iNum = 255; // byte 범위를 벗어남
byte bNum = (byte)iNum; // byte로 강제 형변환
System.out.println(bNum);
double dNum = 3.14;
int inum = (int)dNum;
// double형을 강제적으로 int로 쓰기
System.out.println(inum);
double ddNum = 1.2;
float fNum = 0.9F; // double이 기본이라 float는 꼭 뒤에 F 붙이기
int iNum1 = (int)ddNum + (int)fNum; // 형 변환 하고 더하기
int iNum2 = (int)(ddNum + fNum); // 더하고 나서 형변환
System.out.println(iNum1);
System.out.println(iNum2);
// 결과가 다르게 나온다
}
}
자바의 연산자들
항과 연산자
- 항 (operand) : 연산에 사용되는 값
- 연산자 (operator) : 항을 이용하여 연산하는 기호
대입 연산자 (assignment operator)
- 변수에 다른 변수나 값을 대입하는 연산자
- 이항 연산자 중 우선 순위 가장 낮음
- 왼쪽 변수 = 오른쪽 변수 (또는 식, 값)
부호 연산자
- 단항 연산자
- 변수의 부호를 유지하거나 바꿈 +num, -num
- 부호만 써서는 값은 바뀌지 않고 그 값을 가져와 참조해서 바뀐 부호로 출력한다.
- 실제 변수의 값을 바꾸려면 대입 연산자를 이용해야함
산술 연산자
사칙연산 가능
myNum = myNum + yourNum;
myNum += yourNum;
// 위 둘은 같은 의미
증가, 감소 연산자
- 단항 연산자
- 변수의 값을 1 더하거나 1 뺄 때 사용
- 연산자가 항의 앞에 있는가 뒤에 있는가에 따라 연산 시점과 결과가 달라짐
- 문장(statement)의 끝(;)을 기준으로 연산 시점을 생각해야함
- num++ : 일단 먼저 증가시켜라
- ++num : 일단 이 변수를 활용하고 나중에 증가시켜라
package ch01;
public class OperatorTest {
public static void main(String[] args) {
int gameScore = 150;
int lastScore = ++gameScore;
// 항의 앞에 ++가 있으면 끝나기 전에 증가된다.
// gameScore, lastScore 둘 다 150
int lastScore = gameScore++;
// 이 문장이 끝난 후 증가시킴
// lastScore은 150, gameScore은 151
System.out.println(lastScore);
System.out.println(gameScore);
}
}
관계 연산자 (비교 연산자)
- 연산의 결과가 true, false로 반환됨
- 조건문, 반복문 조건식으로 많이 사용
- ==, !=, <= 등등
논리 연산자
- 관계 연산자와 혼합하여 많이 사용
- 연산 결과가 treu, false로 반환됨
- && (논리 곱) : 모두 참인 경우에만 결과 참 (AND)
- || (논리 합) : 두 항 중 하나만 참이여도 참 (OR)
- ! (부정) : 참인 경우 거짓으로 바꾸고 거짓인 경우 참으로 바꾸기
논리 연산에서 모든 항이 실행되지 않는 경우 - 단락 회로 평가 (short circuit evaluation)
: 컴퓨어 입장에서 앞의 항이 false이면 논리곱(AND) 연산시 뒤에 항은 보지않고 출력
package ch01;
public class LogicalTest {
public static void main(String[] args) {
int num1 = 10;
int i = 2;
boolean value = (((num1 = num1 + 10) < 10) && ((i = i + 2 ) < 10));
System.out.println(value);
System.out.println(num1); // 20 출력, num1은 증가하였다.
System.out.println(i); // 2 그대로 출력, i는 증가하지 않았다.
// 앞의 항이 이미 false라서 뒤의 항은 보지않았다
}
}
조건 연산자
- 삼항 연산자
- 조건식의 결과가 true인 경우와 false인 경우 다른 결과가 수행됨
조건식 ? 결과1 : 결과2;
조건식이 참이면 결과1, 거짓이면 결과2 출력
package ch01;
import java.util.Scanner;
public class ConitionTest {
public static void main(String[] args) {
int max;
System.out.println("두 수를 입력 받아서 더 큰 수를 출력하세요\n ");
Scanner scanner = new Scanner(System.in);
System.out.println("입력 1 : ");
int num1 = scanner.nextInt();
System.out.println("입력 2 : ");
int num2 = scanner.nextInt();
max = ((num1 > num2)? num1 : num2);
// num1이 더 큰 경우 num1 출력
System.out.println(max);
}
}
비트 연산자
- ~ : 비트의 반전(1의 보수)
- & : AND 연산자 (둘 다 참이면 1)
- | : OR 연산자 (둘 중 하나라도 참이면 1)
- ^ : XOR 연산자 (두 비트 서로 다르면 1)
- << : 왼쪽 shift (2비트 만큼 왼쪽으로 이동하고 0으로 끝을 채워준다, 비트가 옮겨진 개수만큼 2^n 곱해짐)
- >> : 오른쪽 shift (2비트 만큼 오른쪽으로 이동하고 0으로 채워준다, 비트가 옮겨진 개수만큼 2^n 나눠짐)
- >>> : 오른쪽 shift (>>와 동일하지만 채워지는 비트 0)
- 비트 연산자 쓰이는 곳 : 좀 더 빠른 operation 할 때 사용
- 마스크 : 특정 비트를 가리고 몇 개의 비트 값만 사용할 때
- 비트 켜기 : 특정 비트들만을 1로 설정해서 사용하고 싶을때 (마스킹)
- 예) & 00001111 (하위 4비트 중 1인 비트만 꺼내기)
- 비트 끄기 : 특정 비트들만을 0로 설정해서 사용하고 싶을때
- 예) | 00001111 (하위 4비트 중 0인 비트만 0으로 만들기)
- 비트 토글 : 모든 비트를 1을 0으로 0을 1로 반전하고 싶을 때
package ch01;
public class BitOperationTest {
public static void main(String[] args) {
int num1 = 5;
int num2 = 10;
System.out.println(num1 | num2); // OR
System.out.println(num1 & num2); // AND
System.out.println(num1 ^ num2); // XOR
System.out.println(~num1); // 반전비트
System.out.println(num1 << 2); // 2만큼 왼쪽 shift
System.out.println(num1);
//num1의 값은 변하지 않는다. 5 출력
System.out.println(num1 <<= 2);
// num1 <<= 2를 할 경우는 num1도 바뀐다.
System.out.println(num1);
}
}
1주차 후기
배속이 안되는게 너무너무너무 불편하다 그래서 필기를 하면서 듣다가
타이핑으로 방법을 바꾸었다.. 타이핑을 해도 남는 시간 ^^..
배속 인강에 익숙해진 사람한텐 너무 힘들고 효율이 떨어지는 것,,
좋은 점은 코드에 직접 쳐보면서 진도를 나가기 때문에
같이 치면서 따로 문법적으로 공부한 개념을 복습하고 적용해 볼 수 있음
그래도 앞부분은 빨리 듣고 넘기고 다른 곳에 시간을 투자하고 싶은데 많이 아쉬운 것,,
뒤에 깊게 들어가면 듣는데 시간이 오래 걸릴 것으로 예상하기 때문에 좀 괜찮을수도,,
'JAVA' 카테고리의 다른 글
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 3주차 (0) | 2022.08.23 |
---|---|
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 2주차 (0) | 2022.08.14 |
자바 ( 컬렉션과 제네릭) (0) | 2021.12.02 |
자바 기초 10 (객체 (Object) 지향의 활용) (0) | 2021.10.14 |
자바 기초 9 (다형성) (0) | 2021.10.14 |