TIL / JAVA 1주차(1) / JAVA / 변수 / 연산자

병아리코더 아카이브·2023년 8월 12일

JAVA

목록 보기
1/20
post-thumbnail

JAVA

자바란?

프로그래밍 언어 ( progrming language ) 로 컴퓨터 프로그램 ( 어플리케이션 ) 을 만드는 데 사용.
실행환경 ( JRE ) + 개발도구 ( JDK ) + 라이브러리 ( API )

  • JDK (Java Development Kit ) : Java 개발과 Compile 을 위한 도구

자바의 특징

  1. 배우기 쉬운 객체 지향 언어 : 프로그래밍 언어 + 객체 지향 개념

  2. 자동 메모리 관리 : 가비지 컬렉터 ( GC ) 이용

  3. 멀티 쓰레드 지원

  4. 풍부한 라이브러리로 쉽게 개발 가능

  5. 운영체제에 독립적 : 자바로 작성된 프로젝트는 자바 가상 머신 ( JVM ) 에 의해 여러 운영체제에서 사용될 수 있어 이식성이 높다. ( 한 번의 컴파일로 window, Linux, IOS 모두 실행 가능 )

객체 지향 언어 ( Object Orient Language )
남의 소스를 부품처럼 사용하기 위해 생긴 개념. 하드웨어의 발전 속도에 소프트웨어가 따라가지 못하여 ( 소프트웨어 위기 ) 좀 더 빠르고 편리하게 개발하기 위하여 누군가 공개한 내용을 가져다 쓸 수 있게 만들어 놓은 프로그래밍 언어이다. 그래서 JAVA 는 남의 것을 편하게 쓸 수 있도록 설계되어 있다.

자바 가상 머신 ( JVM )

자바 프로그램이 실행되는 가상 컴퓨터 ( Vertual Machine )
한 번 작성하면 어디서든 실행이 가능하다.

일반적인 어플리케이션은 OS 위에서 실행이 되는데 자바 어플리케이션은 JVM 위에서 실행되기 때문에 OS 와 독립적이다.

IDE ( Integrated Development Environmnet )

프로그램 개발에 관련된 모든 작업 ( 코딩, 컴파일, 실행, 배포 ) 을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어

( ex ) Eclipse, Intelli J, NetBeans etc...


변수 / 상수 / 리터럴 / 형변환

변수란

하나의 값을 저장할 수 있는 메모리 공간 ( RAM )
JS 의 변수와 다르게 용도와 크기 ( 타입 ) 에 맞게 지정해줘야 한다.

변수의 선언 및 저장

값을 저장할 공간을 마련하기 위해서 선언한다
그리고 선언된 변수 이름에 값을 저장한다.

변수타입  변수명;
변수명 = 값;
( ex ) int age;
       age = 20;

위 두 줄을 하나로 작성도 가능하다.

int age = 20;

변수의 초기화

변수에 처음으로 값을 저장하는 것
그 중 지역변수는 실행 전에 꼭 초기화를 해줘야 한다. ( 컴파일 시 에러 발생 )

변수의 타입

기본형 ( Primitive type )

오직 8개 ( boolean, char, byte, short, int, long, float, double ) 이다.
실제 값을 저장한다.

종류/크기1byte2byte4byte8byte
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble

( 4byte는 32bit 8byte는 64bit )

  • boolean : true / false 에 사용
    ( 자바의 최소단위는 1byte 이기 때문에 1bit 로 표현해도 되지만 1byte 로 사용함. )
  • char : 하나의 문자를 저장하는데 사용
    ( 유니코드를 사용하기 때문에 2byte 이용 )
  • byte : 이진 데이터를 다루는데 사용
  • short : c 언어와의 호환을 위해 추가됨 ( 잘 안쓰임 )
  • int : 정수 값을 저장 ( 정수형의 defalut 타입 )
  • long : 아주 큰 정수 값을 저장
  • float : 실수 값을 저장 ( 3.14f 와 같이 f 를 붙여줘야 함 )
  • double : float 보다 정밀도가 더 높음 ( 실수형의 defalut 타입 )

기본형의 표현타입

btye b = 3; 이면 3이란 리터럴이 2진수 8자리로 변환되어 저장

n bit로 표현할 수 있는 값의 개수 : 2^n 개
n bit로 표현할 수 있는 부호없는 정수의 범위 : 0 ~ 2^n - 1 까지
n bit로 표현할 수 있는 부호있는 정수의 범위 : -2^n-1 ~ 2^n-1 - 1 까지
( 0 을 포함해서 2^n -1개이다 )

( 1bit 는 -,+ 부호에 쓰여서 7bit 까지만 사용 )

  • byte : -128 ~ 127 까지   ( -2^7 ~ 2^7 -1 )
  • short : -32768 ~ 32765 까지   ( -2^15 ~ 2^15 -1 )
  • char : 0 ~ 65535 까지   ( 0 ~ 2^16 -1 )
  • int : -20억 ~ 20억 까지   ( -2^31 ~ 2^31 -1 )
  • long : -800경 ~ 800경 까지   ( -2^63 ~ 2^63 -1 )

( 실수형은 1bit : 부호 / 8bit : 지수 / 23bit : 가수 로 표현 )

  • float : 1.4E-45 ~ 3.4E38 로 오차 없는 정밀도는 7자리 이다.
  • double : 4.9E-324 ~ 1.8E308 로 오차 없는 정밀도는 15자리 이다.

참조형 ( Reference type )

기본형을 제외한 나머지 ( String, System etc \cdots )
메모리 주소를 저장 ( 4byte 또는 8byte )

( ex ) Date today = new Date();   --> 참조형 변수 today에 객체의 주소를 저장

1byte -> 8 bit

상수

final

  • final 은 한번 지정되면 프로그램 종료 시까지 변경이 불가능하다.
  • final 은 초기화를 해 줘야 하는데 생성자에서만 초기화가 가능하다.
  • 멤버변수 final 만 선언해주고 초기화를 하지 않으면 final 을 쓸 수 없어서 에러가 뜬다.
  • 각 객체마다 고유의 상수값을 정할 수 있다. ( Heap 영역 )

Static final

  • 변경할 수 없고 클래스의 모든 인스턴스에 대해 동일한 값을 설정할 때는 static final을 사용한다. ( 메소드 영역 )
  • static final int MAX = 10; 과 같이 변수명은 대문자 를 사용한다.
  • 메소드 영역이라 접근 시 Child.MAX 과 같이 원본 클래스에서 접근해야 한다.

리터럴이란

값을 의미 ( value ) ( 기존의 상수 )
( ex ) false / true / 'A' / "String" / 3 / 3.14f / 3.1456 \cdots

byte와 short 변수에는 int 리터럴이 저장 가능하다.

문자와 문자열 리터럴

char ch = 'A'; 						// OK
char ch = 'AB'; 					// Error
char ch = '';						// Error
String s ="ABC";					
String s = new String("ABC");
String s = "";						// 빈문자열도 OK
String s = "A" + "B";				// "AB" 가 저장됨
String s = 7 + "";					// 숫자 7 + 빈문자열 = 문자열 "7" 로 저장

( 문자열 + any type -> 문자열로 형변환 )
( any type + 문자열 -> 문자열로 형변환 )

형변환

변수 또는 상수의 타입을 다른 타입으로 변환하는 것

문자형 <-> 숫자 형변환

  • 3 + '0' -> '3' ( 숫자 + '0' -> 문자형 )
  • '3' - '0' -> 3 (문자형 - '0' -> 숫자 )

문자열 로 형변환

  • "" + any type -> 문자열로 형변환
  • any type + "" -> 문자열로 형변환

문자열 -> 숫자로 형변환

int i = Integer.parseInt("3");				// 만일 ("자바")를 넣으면 Error
double d = Double.parseDouble("3.14");		// 3.14

String str = "3";
str.charAt(0);								// '3'

형변환 연산자 ( 명시적 형변환 )

( 타입 ) 피연산자 로 형변환 가능

큰 타입 -> 작은 타입으로 넘길 시, 값손실이 발생하기 때문에 명시적으로 형변환을 시켜줘야 한다.

double d = 85.4;	
int score = (int)d;	//double 타입의 변수 d 를 int 타입에 집어넣기 위해 형변환 
					// int score = 85; 로 저장이 된다.
                    // 변수 d 의 값은 그대로 85.4 로 남아있음
  • int -> char : (char)65 -> 'A' ( 'A' 의 유니코드는 65 )
  • char -> int : (int)'A' -> 65
  • float -> int : (int)1.6f -> 1 ( 반올림되지 않음 )
  • int -> float : (float)10 -> 10.0f

묵시적 형변환

컴파일러가 자동으로 형변환 시켜줌 ( 자동 형변환 )
( 값손실이 일어나는 것은 ( type ) 로 명시해주어야 한다. )

byte > short > int > long > float > double
            char

( shortchar 은 묵시적 형변환이 되지 않는다 )

byte b = 100; 			// 100 은 int 지만 컴파일러가 자동 형변환 시켜줌 (예외)
						// 100이 -128~127 사이의 값이라서 가능 
byte b = 1000; 			// Error -128~127 사이의 값이 아님
byte b = (byte)1000;	// OK 그러나 값손실 발생해서 -24가 저장

int i = 100;
byte b = i;			// Error 앞의 100은 리터럴(상수)라서 OK
byte b = (byte)i;	// 여기서 i 는 변수라서 형변환시켜줘야 함

연산자

연산자와 피연산자

  • 연산자 : 연산을 수행하는 기호 ( +, -, *, /, % etc \cdots )
  • 피연산자 : 연산자의 연산 수행 대상

연산은 피연산자들을 연산자를 통해 계산하는 것이다.
모든 연산자는 연산 결과를 반환한다.

연산자의 종류

  • 단항 연산자 : 부호연산자 ( +,- ), 증감 연산자 ( ++ , -- ), 논리부정 연산자 ( ! )
  • 이항 연산자 : 나머지연산자 ( % ), 사칙 연산자 ( +, -, *, / ), 비교 연산자, 논리 연산자 ( &&, || )
  • 삼항 연산자 : 조건 ? 맞으면 : 틀리면

외 etc \cdots

증감 연산자

  • 전위형 : 먼저 증가한 뒤 기능을 실행 ( ++i , --i )
  • 후위형 : 기능을 실행한 후 증가 ( i++, --i )

사칙 연산자

산술변환

연산 전에 피연산자의 타입을 일치시키는 것
( 보다 큰 타입으로 일치 )

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

( int 보다 작은 타입은 int 로 변환 )

byte + short -> int + int
char + short -> int + int

그래서 문자형 <-> 숫자 형변환 시
'3' - '0' -> 51 - 48 -> 3 순으로 문자가 숫자로 변환된 것.

Math.round()

실수를 소수점 첫 째 자리에서 반올림한 정수를 반환

long result = Math.round(4.52); // 5 반환

// 파이의 소수 3번째 자리까지만 보고 싶을 때
double pi = 3.141592;
double shortPi = Math.round(pi * 1000)/1000.0; 
// 3141.592 에서 3142 반환한 뒤 다시 1000.0 으로 나누어 3.142 저장
// 3.141 은 (int)(pi*1000)/1000.0 으로 가능함

비교 연산자

문자열 비교

문자열 비교에는 == 대신 equal() 로 비교해야 한다.

  • == : 참조 비교
  • equals() : 내용 비교
// String 리터럴로 생성 시 String Constant Pool 에 저장되어 이곳에서 재사용 가능
// 이 때는 s1 == s2 로 사용해도 true 가 됨.
String s1 = "abc";
String s2 = "abc"; 

// new String(); 으로 String 객체 생성 시에는 s1 과 s2 는 별도의 복사본을 가짐
// 이 때는 s1 == s2 사용해도 false 가 됨.
String s1 = new String("abc");
String s2 = new String("abc");

//equal() 사용하면 true 반환
boolean true = s1.equals(s2);

논리 연산자

  • || : 또는 ( or )
  • && : 그리고 ( and )
  • ! : 앞에 붙여주면 true -> false 와 같이 반대로 바꿔줌 ( not )

10< x < 20 과 같은 연산은 가능하지 않음 -> 10 < x && x < 20 로 연산 가능

삼항 연산자 ( 조건 연산자 )

조건식 ? 식1 : 식2

조건식 이 true 면 식1 반환 / false 면 식2 반환

삼항연산자는 if 문을 간단히 쓸 수 있게 고안된 것.

복합 대입 연산자

i += 3;			// i = i + 3; 
i -= 3;			// i = i - 3;
i *= (10 + j);	// i = i * (10 + j);

1개의 댓글

comment-user-thumbnail
2023년 8월 12일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기