자바 문법 정리 (2)

Soobeen Yim·2023년 4월 14일
0

java

목록 보기
3/3

자바 문법 정리 (2)

오늘 하루도 파이팅이다... 참고로 나는 오늘 스카에서 2샷 추가해서 총 4샷 된 아메리카노 마시는 중이다. 너무 졸려 ㅠㅡㅠ

변수와 자료형

변수란 무엇인가?

변수 = 메모리 공간에 붙여진 이름

    int num1; //변수 num1 선언
    int num2; //변수 num2 선언

자료형의 종류와 구분

  • 정수 표현: byte, short, int, long
  • 실수 표현: float, double
  • 문자 표현: char
  • 참과 거짓의 표현: boolean

변수 이름 짓기

숫자로 시작하면 안 된다.
대소문자를 구분할 줄 알기 때문에 신경써서 이름 지을 것.
특수문자는 변수의 이름에 사용 금지.($과 _ 제외)
키워드는 변수의 이름으로 사용 금지

java의 기본 자료형

정수 자료형

총 byte, short, int, long 4가지가 있다.

int main(String[] args){
    short num1 = 11;
    short num2 = 22;
    short result = num1 + num2;
    System.out.println(result);
}

이러면 33이 나올까?
천만에
절대 안 나온다. 왜냐하면 정수형 연산은 only int형으로 진행하기 때문에 그냥 정수 선언할 때 int형 써라.

실수 자료형

float, double이 있다.

문자 자료형

char 있다. 또한, 유니코드로 구할 수도 있다!

논리 자료형

boolean 있다

true = '참'을 의미하는 값
false = '거짓'을 의미하는 값

상수(Constants)

final이라는 선언을 추가하면 이 변수는 '상수'가 된다.

  • 값을 딱 한 번만 할당할 수 있다.
  • 한 번 할당된 값은 변경이 불가능하다.
public class practice {
    public static void main(String[] args){
        final int MAX_SIZE = 100;
        final char CONST_CHAR = 'h';
        final int CONST_ASSIGNED;
        CONST_ASSIGNED = 20;
        System.out.println("1 is" + MAX_SIZE);
        System.out.println("2 is" + CONST_CHAR);
        System.out.println("3 is" + CONST_ASSIGNED);
    }
}
// output
1 is100
2 ish
3 is20
  • 상수의 이름은 모두 대문자
  • 둘 이상의 단어로 이뤄질 경우에는 단어 사이에 무조건 언더바 넣기

리터럴 상수

int num = 157;

숫자 157은 리터럴 상수다.(그냥 상수도 맞음)

정수형 상수의 표현 방법

  • 10진수로 int형 정수 표현
int num = 11 + 22 + 33;
  • 8진수로 int형 정수 표현: 숫자 앞에 0 삽입
int num = 011 + 022 + 033;

-16진수로 int형 정수 표현: 숫자 앞에 0x 또는 0X 삽입

int num = 0x11 + 0x22 + 0x33;

자바는 byte형이나 short형 정수의 표현 방법을 제공하지 않기 때문에
byte num1 = 5
short num2 = 3
로 초기화가 가능하다.

long형은 숫자의 끝에 문자 L이나 l를 붙인다.
System.out.println(189248710L)

2진수 표현과 언더바

앞에 0B 또는 0b를 붙임.
그리고 숫자가 어마무시하게 클 경우에는 underbar를 넣어준다

int num = 100_000_000

실수형 상수

double pi = 3.1415 //실수형 상수

만약, 두 실수가 double형인 상수를 밝히고 싶다면, d나 D 붙임
float형도 마찬가지

System.out.println(3.00065D + 4.19006D);
  • 0.5 -> .5
  • 5.0 -> 5.
  • 0.7F -> .7F
  • 7.0F -> 7.F
    이런 식으로 정의 가능

부울형 상수와 문자형 상수

부울형: true false
문자형: '한' '글' 'A' 'Z'

추가적으로 이스케이프 시퀀스(escape sequences)도 있음

'b' 백스페이스 문자
'\t' 탭 문자
'\' 백슬러시 문자
'\'' 작은따옴표 문자
'\"' 큰따옴표 문자
'\n' 개 행 문자
'\r' 캐리지 리턴 문자

public class practice {
    public static void main(String[] args){
    System.out.println("AB" + '\b' + 'C');
    System.out.println("AB" + '\'' + 'C');
    System.out.println("AB" + '\t' + 'C');
    System.out.println("AB" + '\r' + 'C');
    }
}
//output
AC
AB'C
AB	C
C

형 변환

자료형이 다른 두 값을 대상으로 덧셈을 진행하지 못해서 형을 맞추어 줘야 함

int num1 = 10;
double num2 = 4.00089D;
System.out.println(num1 + num2);

num1은 int형, num2는 double형이기 때문에 오류 생김. 그래서 자료형 변환을 해줘야 함.

자동 형 변환

  • 자료형의 크기가 큰 방향으로 형 변환이 일어난다.
double num1 = 30;
//int형 정수 30은 double형으로 자동 형 변환
  • 자료형읰 크기에 상관없이 정수 자료형보다 실수 자료형이 우선한다.
System.out.println(59L + 34.5)
//long형 정수 59L은 double형으로 자동 형 변환

명시적 형 변환

double pi = 3.1415;
int wholeNumber = (int)pi;
//pi의 값을 int형으로 명시적 형 변환

long num1 = 300000007L;
int num2 = (int)num1;
//num1의 값을 int형으로 명시적 형 변환

근데 두 번째 case는 오류가 생긴다. long형은 int형보다 바이트를 많이 차지하기 때문에 크기가 잘려 나간다. 4바이트만 저장된다.

또한, 이런 경우에서도 오류가 생긴다.

short num1 = 1;
short num2 = 2;
short num3 = num1 + num2:

그 이유는 무엇이냐면 일단 앞에서도 얘기했다 싶듯이 연산은 모두 int형으로 일어나기 때문에 인식하지 못한다! 그러면 short형으로 더한 값을 그래도 output으로 나타내고 싶은데 어떻게 하냐?

short num3 = (short)(num1 + num2)

이렇게 한 번 더 감싸주면 된다!!

연산자 Operators


우선순위에 맞춰서 계산해야 한다.

대입 연산자, 산술 연산자

'='
연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입
'+'
두 피연산자의 값을 더함
'-'
왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺌
'*'
두 피연산자의 값을 곱한다
'/'
왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다
'%'
왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때,
얻게 되는 나머지를 반환함

+) 자바에선 추가적으로 7 / 3를 해도 정수 2가 나온다.(파이썬은 3.5가 나옴)
실수형이 궁금할 경우에는 7.0 / 3.0 = 2.3333333335

복합 대입 연산자

a = a + b <-same-> a+= b
a = a - b <-same-> a-= b
a = a b <-same-> a= b
a = a / b <-same-> a/= b
a = a % b <-same-> a%= b

관계 연산자

<

<=

==
!=

논리 연산자

&& and
|| or
! not

다만 주의해야 할 점이 있다.

public class practice {
    public static void main(String[] args){
        int num1 = 0;
        int num2 = 0;
        boolean result;

        result = ((num1 += 10) < 0) && ((num2 += 10) > 0);
        System.out.println("result =" + result);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);

        result = ((num1 += 10) > 0) || ((num2 += 10) > 0);
        System.out.println("result =" + result);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);

    }
}

왜 num2의 값이 다 0만 나오는지에 대하여 궁금해하는 사람이 있을 것 같다.

(num1 += 10) < 0) && ((num2 += 10) > 0);
앞 문장이 false가 나오면 뒤가 true든 false든 && 때문에 무조건 false가 나오기 때문에 뒷문장을 실행하지 않는다.

((num1 += 10) > 0) || ((num2 += 10) > 0);
이 문장도 마찬가지다. 앞에 true가 나오면 ||는 or라서, 뒷문장이 false가 나오든 true가 나오든 true로 실행이 되기 때문에, 실행하지 않는다.

그렇기 때문에 이러한 오류가 생기는 것이다. 어떻게 하면 오류를 없애느냐?

num1 += 10;
num2 += 10;
result = (num1 < 0) && (num2 > 0);

이렇게 코드를 나누어 작성하면 괜찮다.

부호 연산자

short num1 = 5;
short num2 = (short)(+num1);
short num3 = (short)(-num1);
System.out.println(num2);
System.out.println(num3);
//output
5
-5

이런 식으로 가능하다

증감 연산자

++ 피연산자에 저장된 값을 1 증가
-- 피연산자에 저장된 값을 1 감소

++7 있으면 바로 증가,
7++ 실행 후 1 증가

비트 연산자

& 비트 단위를 AND 연산을 한다
| 비트 단위를 OR 연산을 한다
^ 비트 단위를 XOR 연산을 한다
~ 피연산자의 모든 비트를 반전시켜서 얻은 결과 반환

비트 쉬프트 연산자

(안 귀찮을 때 추가하겠습니다.)

profile
화이트 해커가 되고 말겠어 .....

0개의 댓글