본문 바로가기

코딩공부일지/자바독학

[자바혼공]자바의정석 시작: 변수/ 연산자

  • 자료출처

생활코딩 by egoing - 자바: https://opentutorials.org/module/516

남궁석의 자바의정석: https://github.com/castello/javajungsuk_basic/

 

  • 변수

1. 변수란?: 하나의 값을 저장할 수 있는 저장공간(그릇)

1) 변수를 선언하는 방법:
 변수타입 변수이름 ;
    int            x;

==>"x"라는 이름의 변수(저장공간)이 생기게 됨
 

2) 변수에 값을 저장하는 법
    변수이름 = 값;
      x = 5;
*프로그래밍에서는 "="가 등호가 아닌, "저장"의 의미를 갖는 대입연산자임

3) 하나의 변수는 하나의 값만을 저장할 수 있음(중복저장시 마지막 저장값이 남음)
     x = 5;
     x= 3;
     ===> System.out.println(x)  /// 결과값은 3
 
 4) 변수, 저장값 한 줄에 적기
      int x;                             iint x = 5; 
       x=5;



 

2. 변수의 타입

  1) 기본형 : 정수형 & 실수형 

 

정수형

데이터 타입 메모리의 크기 표현 가능 범위
byte 1 byte -128 ~ 127
short 2 byte -32,768 ~ 32,767
int 4 byte -2,147,483,648~2,147,483,647
long 8 byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

실수형

float 4byte ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38)
double 8byte ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d)

문자

char 2byte 모든 유니코드 문자
String 4byte 문자열

 

3. 상수와 리터럴

  1) 상수(constant): "저장공간" but 저장 이후 값 변경 불가 (변수는 가능)

 - 상수 선언방법: 변수 타입 앞에 키워드 "final" 입력
     final int MAX_SPEED = 10;
     (변수 앞에 final이 붙어있으므로 상수에 저장된 값은 추후 변경할 수 없음)
       * 상수의 이름은 capital 표기가 관례임

  2) 리터럴(literal) : 수학적 개념의 상수임, 그 자체로 값을 의미하는 것

 

4. 리터럴 타입과 접미사

    : 리터럴에도 타입이 있으며, 변수의 타입은 리터럴의 타입에 의해 결정됨. 

종류 리터럴 접미사
논리형 false, true 없음
정수형 123, 0b0101, 100L L
실수형 3.14, 3.0, 1.4f f,d
문자형 'a', '1', '\n' 없음
문자열 "ABC", "123", "A", " ", "TRUE" 없음

 * 자바 defalult 컴파일 값: 정수형 -> int, 실수형 ->double

 

5. 두 변수간 값 바꾸기

     int x= 10;

     int y=20;

      x<->y

int tem = x;
x= y;
y= tem;

6. 기본형과 참조형

   - 기본형: 정수 & 실수 데이터타입 (8종)

      계산을 위한 실제  값 저장

종류\크키 1byte 2byte 4byte 8byte
논리 boolean      
문자   char    
정수 byte short int long
실수     float double

   - 참조형 :그 외 (String, System 등)

     객체의 주소를 저장 (메모리 주소) , 크기 - 4 byte, 8 byte 

 

7. 타입간 변환방법

   1)숫자-> 문자: 숫자에 '0' 더하기

      (char)(3+ '0') -> '3'

   2) 숫자-> 문자열: 숫자에 "" 더하기

       3 + "" -> "3"

   3) 문자->숫자: 문자에서 '0' 빼기

      '3'- '0' = 3

   4) 문자열->숫자:  Interger.parselnt()  || Double.parseDouble() 사용

       Interger.parseInt("3") => 3

       Interger.parseDouble("3.14")=> 3.14 

   5) 문자-> 문자열: "" 더하기

       '3' +"" = "3"

 

 


  • 연산자

1. 연산자의 종류

  1) 산술연산자

+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나머지

  2) 비교연산자 

       > , <,  >=,  <=,  ==,  != : 크기 대소비교

  3) 논리연산자

       && , || , !, &, |, ^, ~ : and 와 or 으로 조건을 연결

  4) 대입연산자 

        = : 우변의 값을 좌변에 저장

  5) 기타

      (type), ?: , instanceof : 형변환연산자, 삼항연산자 등

 

 

2. 연산자의 우선순위

     [괄호]  - 산술 > 비교 > 논리 > 대입  - 단항 >이항 > 삼항

     대입 연산자 제외, 연산 진행방향은( 왼 -> 오 )

 

3. 증감연산자 ( ++ , --)

전위형 j = ++i; ++i;
j = i;
값이 참조되기 전에 증가시킨다.
후위형 j = i++; j = i;
i++;
값이 참조된 후에 증가시킨다.

4. 부호연산자, 논리부정연산자

   1) 부호연산자   (-, +)

        - : x*-1

        +: x*+1

    2) 논리부정연산자  (!)

        data type boolean 의 값을 반대로

        true <-> false

 

 

5. 형변환연산자

-형변환(casting): 변수나 리터럴의 타입을 다른타입으로 변환하는 것 

-변환방법: (타입)피연산자

           double d = 85.4;
            int score = (int)d;
====>System.out.println(score) => 85

 

6. 자동 형변환

-서로 다른 타입끼리 대입 연산 시 형변환으로 타입 일치시키는 것이 원칙

-경우에 따라 컴파일러가 새략된 형변환을 자동적으로 해줌

-자동 형변환 원칙: 기존 값을 최대한 보존할 수 있는 타입으로 변환

-넓은그릇 -> 좁은그릇 : x (에러)

- 좁은그릇-> 넓은그릇 : O (자동형변환)

                            1 Byte       2 Byte                     4 Byte             8 Byte               4 Byte        8 Byte               

https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/module/516/1822.gif

                              왼->오 : 자동형변환

                              오->왼 : 자동형변환 불가, 형변환 연산자 기입 

 

float f =1234; 
===> float f = (float) 1234;

자동 형변환이 불가한 경우: 리터럴 값이  데이터타입(그릇) 보다 클 때

byte b = 1000 
====> 에러 (자동 형변환 불가)  : 
 incompatible types: possible lossy conversion from int to byte

// 그러나 ,,
byte b= (byte) 1000 
 ====> 출력가능,  출력값: -24

 

 

7. 산술변환: 피연산자의 타입일치를 위해 자동 형변환되는 것

1) 두 피연산자 타입을 일치시킴 (큰 타입으로 일치)

long + int -> long + long => long
float + int -> float + float => float
double +float -> double + double =>double

2)피연산자 타입이 int보다 작은 타입이면, int로 변환(default값이 int)

   : int 보다 작은 타입일 경우, 산술계산이 일어나면 overflow(손실)이 발생할 가능성이 크기때문

byte + short -> int + int => int
char+ shoart-> int+ int => int

3) 연산결과의 데이터타입은 피연산자의 데이터타입과 일치

byte a, b= 10, 20;
byte c= a+b                                                ====>에러발생
System.out.println(c);

 a+b의 결과값은 int 형인데 (자동형변환에 의해서) 명시적 형변환 없이 a+b (int) 값을 byte 라는 타입의 c에 넣으려고 했기 때문에! byte c 라는그릇은 int 를 담지 못함. 따라서 byte c에 a+b 값을 넣으려면 a+b를 byte로 수동변환해야함

byte c= a+b                                                
====>byte c= byte (a+b)

int a = 1_000_000;
int b=  2_000_000;
long c= a*b;

System.out.println(c) = -1454759936 
 
a*b를 long이라는 그릇에 담으려고 해도 이미 a*b의 결과값은 int*int 값인 int로 출력,
a*b결과값이 이미 int 값(-1454759936 )으로 출력된 상태이기 때문에
더 큰 그릇에 담아도 값이 변하지 않음.

따라서 원하는 결과값을 얻으려면,
a, b의 데이터타입을 long으로 미리 바꾸어야 결과값 a*b도 long으로 출력가능
====>long c= (long) a*b


8. Math.round()반올림: 소수점 첫자리 반올림 결과의 정수를 반환

     long result =Math.round(4.52) ; // resutl 에 5 저장

9. 문자열의 비교: ==가 아닌, .equals() 메서드사용

- .equals() :대소문자 구분

-.equals.IgnoreCase(): 대소문자 구분x

10. 연산자 종류

1) 사칙연산자

- 피연산자가 int인 경우, "0"으로 나눌 수 없음 (에러발생)

-나누기 연산자의 피연산자가 모두 int인 경우, 연산결과도 int로 출력, 올바른 연산결과를 얻으려면 피연산자 둘 중 한쪽을 f/d로 변환해야함

10 / 4 -> 2 //소수점 이하는 버림
int   int    itn

10 / 4.0f ->2.5f
int   float    float

2) 나머지연산자: %

-왼 피연산자를 오 피연산자로 나눈 나머지 값 반환

-나누는 수 (오 피연산자)는 !=0

-정수, 실수, 음수(의경우 부호 무시)가능

-짝,홀 또는 배수검사에 사용

3)비교연산자: 결과는 true / false 중 하나

-대소비교연산자: >, <, <=, =>

-등가비교연산자: ==, !=

4)논리연산자: -&&, || 

5)논리부정연산자:!

6)조건연산자: 조건식 ? 참값 : 거짓값

                      if              true   false 

7)대입연산자: 오른쪽에서 왼쪽으로 계산

가장 우선순위가 낮은 연산자

x =  y = 3 
<---------

- lvalue(대입연산자의 왼쪽 피연산자) / rvalue(대입연산자의 오른쪽 피연산자)