본문 바로가기
☕ Java 웹 프로그래밍/Java

[프로그래머스] Java(자바) 입문 | Part 2. 변수와 계산

by 일단연 2023. 4. 26.

 변수 

변수

  • 값을 저장할 수 있는 메모리의 공간
  • cf ) 자바: 강형 언어
    • 컴파일 시 모든 변수의 type이 결정됨 (= 처음 변수를 선언할 시점부터 해당 변수 type을 잘 설정해야 하고, 선언 이후엔 그에 알맞은 data만 저장할 수 있음)
    • 서로 다른 형 사이의 변환이 금지됨
    • 서로 다른 형 사이의 변환이 항상 명시적으로 지정되어야 함

변수의 선언

  • 타입 변수이름;
    • int count; (정수 값을 담을 수 있는 count라는 이름의 변수를 선언)
    • double average; (실수 값을 담을 수 있는 average라는 변수를 선언)
  • 명명규칙
    • 변수의 이름을 정할 때 Java에서 정해놓은 규칙
  • 식별자(identifier)
    • 클래스, 메소드, 변수 등 다양한 대상에 대해 이름이 붙여지는 경우, 그 이름을 뜻함

Java 식별자 명명 규칙

  • 하나 이상의 글자로 이루어져야 함
  • 첫 번째 글자는 문자 이거나 '$', '_'이어야 함
  • 두번재 이후의 글자는 숫자, 문자, '$', '_'이어야 함
  • '$', '_' 이외의 특수문자 사용 불가능
  • 길이 제한이 없음
  • 키워드는 식별자로 사용할 수 없음
  • 상수 값을 표현하는 단어 true, false, null은 식별자로 사용할 수 없음

변수 명명 관례

  • 첫 번째 문자가 소문자인 명사로 정함
  • 여러 단어로 구성된 이름의 경우 두번째 단어부터 첫글자를 대문자로 함
  • '_'을 쓰지 않음
    • 규칙은 반드시 지켜야 한다. 지키지 않으면 컴파일시 에러가 발생함.
    • 관례는 지키지 않아도 컴파일에러가 발생하지는 않지만, 약속이기 때문에 지켜주는것이 좋다.

변수의 사용

  • 변수명 = 값;
    • count = 10; (count 라는 int형 변수에 정수값 10을 담음)
    • count = 20; (count 라는 int형 변수에 정수값 20을 담음. 원래 담겨있던 10은 없어짐. 변수는 값이 얼마든지 변할 수 있음)
    • average = 11.1 (average라는 double형 변수에 실수 값 11.1 을 담음 )
package javaStudy;

public class VariableExam {

	public static void main(String[] args) {
		int count;
		
		count = 10;
		
		count = 20;
		
		System.out.println(count);
		
//		count = 11.1; //위에서 count를 int로 정의했으니 오류 발생
		
		double avg = 11.1;
		
		String name = "carami";
		
	}

}

실습


 

 상수 

상수(常數)

  • 수식에서 변하지 않는 값을 의미

상수의 선언

  • final 상수타입 상수명;
    • final int J;

상수의 사용

  • 상수명 = 값;
    • J = 10; (J에는 값을 담을 수 있는 기회가 단 한 번만 허락됨)

상수 명명 관례

  • 대문자로만 구성된 명사로 정함
  • 여러 단어로 구성된 이름의 경우 단어 사이에 '_'을 써서 구분함.

상수를 사용해야 하는 경우

  • 값이 변하면 위험한 경우에 상수를 사용
  • 값만 봤을때 무엇을 의미하는지 쉽게 파악할 수 없는 값에도 값 자체를 사용하기 보다는 상수를 사용

 

 기본형 타입 

기본형

  • 가장 기본이 되는 데이터 타입으로써 정수형, 실수형, 문자형, 불린형을 의미

논리형

  • 논리형은 크기가 1byte이고 true와 false 중에 한 가지 값을 가질 수 있음

문자형

  • 문자형은 char로 2byte크기를 가짐 문자는 작은따옴표를 이용하여 한 글자를 표현할 수 있음

정수형

  • 정수형은 정수를 표현하는 데이터 타입인데 표현할 수 있는 정수의 범위에 따라서 다양하게 제공됨
  • 정수형에서 가장 자주 사용하는 int는 4바이트
  • long형은 8byte크기를 가짐. int 보다 더 큰 범위의 정수를 표현하고 싶을 때 사용

실수형

  • 실수형은 float과 double형이 있음
  • float은 4바이트, double은 8바이트로 double은 float보다 더 큰 범위의 실수를 표현할 수 있음

리터럴

  • 컴퓨터 과학 분야에서 리터럴이란, 소스 코드의 고정된 값을 대표하는 용어
  • 어떤 특정한 값 자체를 의미 (예: true, false, 10, 11.1, a 등 값 자체)
  • 특정 타입의 변수에 대입할 수 있음

기본형 타입의 사용 방법

package javaStudy;

public class PrimitiveDataTypeExam {

	public static void main(String[] args) {
		boolean isFun = true;
		System.out.println(isFun);
		
		char c = 'f';
		
		int x = 59;
		
		long big = 345356453L; //값 바로 뒤에 소문자 l이나 대문자 L을 적어야 함
		
		float f = 32.5f; //실수 뒤에 소문자 f나 대문자 F를 붙여야 함
		
		double d = 12542325323.35;
		
	}

}

실습


 

 기본형 타입변환 

형변환 (Type Casting)

  • 변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것

기본형 타입의 크기 비교

  • byte < short, char < int < long < float < double

묵시적(암묵적) 형변환

  • 크기가 작은 타입 > 더 큰 타입으로 바꿀 때에는 묵시적으로 형을 바꿔줌
int x = 50000;
long y = x;

명시적(강제) 형변환

  • 크기가 큰 타입 > 더 작은 타입으로 바꿀 때에는 명시적으로 변환해줘야 함
long x = 50000;

//int y = x; //이렇게 묵시적으로 수행하면 컴파일러는 오류를 발생시킴

int y = (int) x; //반드시 **(타입)** 으로 명시적으로 형을 바꿔줘야 함

실습 1

실습 2


 

 산술연산자 

연산자와 연산식

  • 연산: 데이터를 처리해 결과를 산출하는 것
  • 연산식 ** x = y + z;**
    • y와 z를 더한 값을 x에 대입한다는 것을 의미
    • 연산자 =: 대입연산자이고, 연산자 +: 산술연산자
    • y와 z: 피연산자
    • x = y+ z 는 연산식
  • 피연산자(Operand)
    • 연산 대상이 되는 데이터 (리터럴, 변수)
  • 연산자(Operations): 연산에 사용되는 표시나 기호 (+, -, *, /, %, = 등)
    • 부호 연산자(+, -) - 단항연산자에 속함
      • 부호를 결정
        • +: 변수 앞에 붙을 경우, 그 변수의 부호를 그대로 유지시킴
        • -: 변수 앞에 붙을 경우, 그 변수의 부호를 반전시킴 (음수는 양수로, 양수는 음수로 바꿈)
      // 부호 연산자 +
      int i1 = +5;
      int i2 = +i1;
      System.out.println(i2); //결과: 5
      
      //부호 연산자 -
      int i3 = -4;
      int i4 = -i3;
      System.out.println(i4); //결과: 4
      
    • 증감 연산자(++, - -) - 단항연산자에 속함
      • 1씩 증가하거나 감소시킴
      • 피연산자 앞에 붙을 때
      • int i4 = ++i3; // i3의 입장: i3 = i3 + 1; // i4의 입장: i3에 1을 더한 후에 그 값을 i4에 넣어줌
      • 피연산자 뒤에 붙을 때
      • int i5 = i3++; // i3의 입장: i3 = i3 + 1; // i5의 입장: i3의 원래 값을 i5에 먼저 대입시킨 후 i3에 1을 더함
    • 산술 연산자(+, -, *, /, %) - 이항연산자에 속함
      • 산술 연산을 가능케 함
        • 2개의 변수를 이용한 산술 연산자
        • System.out.println(i + j); System.out.println(i - j); System.out.println(i * j); System.out.println(i / j); System.out.println(i % j);
    • 피연산자의 개수로 분류한 연산자
      • 단항 연산자: 피연산자가 1개인 연산자 (부호 연산자, 증감연산자)
      //부호 연산자 
      int i1 = -5;
      int i2 = +i1;
      int i3 = -i1;
      
      //증감 연산자 
      int i4 = ++i3;
      int i5 = i3++;
      int i6 = --i3;
      int i7 = i3--;
      
      • 이항 연산자: 피연산자 하나로 연산할 수 없는 연산자
      int i = 5;
      int j = 2;
      
      System.out.println(i +  j);
      System.out.println(i -  j);
      System.out.println(i *  j);
      System.out.println(i /  j); // 정수와 정수를 연산한 것이기 떄문에 실제 값은 2.5지만 결과는 2
      System.out.println(i /  (double) j);
      // 두 정수 중 최소한 하나라도 실수로 형변환하면 2.5로 결과 낼 수 있음
      System.out.println(i %  j);

실습


 

 비교연산자와 대입연산자 

비교연산자:  = = ,  ! = ,  < ,  > ,  < = ,  > =

  • 비교 연산자의 결과는 boolean
int i = 10; *// =: 대입연산자*
int j = 10;    

*// i 와 j 가 같은지 비교하는 비교 연산자*
System.out.println(i == j );
System.out.println(i != j );
System.out.println(i < j);
System.out.println( i > j);
System.out.println(i <= j);
System.out.println(i >= j);

대입 연산자

  • 단순 대입 연산자
    • i = 10
    • 오른쪽에 있는 피연산자의 값을 왼쪽 피연산자의 변수에 저장
  • 복합 대입 연산자
    • 정해진 연산을 수행한 후에 결과를 대입
i += 10; *// i = i + 10; 과 같은 의미*

System.out.println(i);  
System.out.println(i -= 5); // i = i - 5;
System.out.println(i);

실습


 

 연산자 우선순위  (참고)

순서 연산방향 연산자 피연산자 타입 피연산자
1 좌측부터 [멤버] . 객체, 필드(멤버)  
    ’ ’ [첨자] [   ] 배열, int  
    ’ ’ ( args ) 메소드, arglist  
  ’ ’ ( ) 괄호 속 연산자   다양
    ’ ’ [증감] ++, -- (전위연산자) 변수 variable (예: ++x) 단항
2 우측부터 [증감] ++, -- (후위연산자) 변수 variable (예: x++) ’ ’
    ’ ’ [부호] +, - number 숫자 (예: -3, +3) ’ ’
    ’ ’ [비트 NOT] ~ integer ’ ’
    ’ ’ [논리 NOT] ! boolean ’ ’
3 우측부터 new class, arglist  
    ’ ’ [타입 캐스트] ( type ) type, any  
4 좌측부터 [산술] *, /, % number (*,/,%)  number 이항
5 좌측부터 [산술] +, - number (+,-) number 이항
    ’ ’ + String + (any)  
6 좌측부터 [쉬프트] << integer, integer 이항
    ’ ’ [쉬프트] >> integer, integer ’ ’
    ’ ’ [쉬프트] >>> integer, integer ’ ’
7 좌측부터 [비교] <, <= number, number 이항
    ’ ’ [비교] >, >= number, number ’ ’
    ’ ’ [비교 - 인스턴스의 실제 타입 반환] instanceof reference , type ’ ’
8 좌측부터 [비교] == primitive,primitive 이항
    ’ ’ [비교] != primitive,primitive ’ ’
    ’ ’ == reference, reference  
    ’ ’ != reference, reference  
9 좌측부터 [비트] & integer, integer 이항(단항)
    ’ ’ & boolean,boolean ’ ’
10 좌측부터 [비트] ^ integer, integer 이항(단항)
    ’ ’ ^ boolean,boolean ’ ’
11 좌측부터 [비트] | integer, integer 이항(단항)
    ’ ’ | boolean , boolean ’ ’
12 좌측부터 [비트] ~ integer, integer 이항(단항)
    ’ ’ ~ boolean , boolean ’ ’
13 좌측부터 [논리] && boolean, boolean 이항
14 좌측부터 [논리] || boolean, boolean 이항
15 우측부터 [조건] ?: boolean, any 삼항
16 우측부터 [대입] = variable, any 이항
    ’ ’ [대입] +=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |= variable, any ’ ’
17 우측부터 -> argilist, method body  
  • 주의할 점
    • 증감연산자의 경우, 전위연산자(예: ++i)인지 후위연산자(예: i++)인지에 따라서 우선순위가 바뀔 수 있음
    • 논리연산자 중 && (and) 연산과 || (or) 연산이 나왔을 경우 && (and) 연산이 먼저 수행됨

예제 1

int a = 5;
int b = 10;
int c = 5
System.out.println(  a - b * c );
*//결과는 -45가 나오게 됩니다*
  • 곱셈이 우선순위가 높기 때문에 b와 c를 먼저 곱한 후, a에서 b와 c를 곱한 값을 빼므로 결과는 -45
  • 비교연산자가 논리연산자보다 우선순위가 높음

예제 2

int a = 5; 
System.out.println(++a - 5); *// 결과: 1*
  • 단항 연산자이며 전위 연산자인 ++ 가 먼저 연산됨
  • a가 6으로 바뀐 후 5 를 빼게 되므로 결과는 1

예제 3

int a = 5; 
System.out.println(a++ - 5); 
*//결과는* System.out.println(a); 
*//결과는 6*
  • 단항 연산자이며 후위 연산자인 ++ 가 나중에 연산됨
  • a가 5인 상태에서 5를 뺀 후에 a++(a=a+1) 이 실행되므로 출력결과는 0