자바 기본 배우기 -변수, 자료형, 연산자-

1. 변수(variable)

 

1-1) 정의

 

데이터를 저장할 메모리의 위치를 나타내는 이름

 

메모리 상에 데이터를 보관할 수 있는 공간을 확보하겠다

 

적절한 메모리 공간을 확보하기 위해 변수의 타입이 등장했다

 

= 이라는 할당 연산자를 통해 CPU에게 연산작업을 의뢰함

 

변수를 선언한다는 것은 메모리 공간에 어떤 값을 담을 일부 공간을 잡는 것

 

어떤 값을 넣을지에 따라 잡아야할 공간의 크기가 달라져서, 변수의 타입이 필요했다

 

1-2) 메모리 단위

 

0과 1을 표현하는 bit

 

8bit = 1byte

 

 

1-3) 작명 규칙

 

대소문자를 구분한다

 

공백은 허용하지 않는다

 

숫자로 시작할 수 없다

 

특수문자 중에서 $, _만을 변수 이름에 허용한다

 

예약어(keyword = 자바 문법을 위해 미리 지정된 단어)는 사용불가

 

합성어의 경우는 주로 camelCase를 사용

 

한글을 이용한 변수명도 가능하나 추천하지 않는다

 

당연히 의미가 없는 변수명으로 작성하는 것도 추천하지 않는다

 

 

1-4) 변수명 case

 

강제성은 없고 관례적으로 사용함

 

1) PascalCase = 단어마다 첫글자는 대문자 (클래스 이름에 주로 사용)

 

2) camelCase = 첫 단어 첫글자는 소문자, 나머지 단어는 첫글자 대문자(변수명, 함수명에 주로 사용)

 

3) snake_case = 단어마다 글자끼리는 _으로 연결해서 작성(python에서 주로 사용)

 

자바에서 snake_case는 상수에 주로 사용함. (모든 글자 대문자)_(모든 글자 대문자)

 

4) kebab-case = 단어마다 글자끼리 -으로 연결(HTML/CSS에서 속성명에 주로 사용)

 

 

1-5) 예약어

 

당연히 외울 필요는 없고.. 자바 쓰다보면 알아서 외워짐

 

변수명으로 사용 불가능

 

IDE에서는 글씨가 보라색으로 바뀐다고??

 

 

2. 자료형(data type)

 

기본 자료형(primitive type)과 참조 자료형(reference type)이 존재함

 

참조 자료형은 기본 자료형 8가지 이외의 모든 자료형을 의미한다

 

참고로 자주 쓰는 String은 기본 자료형이 아니고 참조 자료형이라고 함

 

2-1) 기본 자료형

 

미리 정해진 크기의 메모리 사이즈를 표현하며, 변수 자체에 값을 저장할 때 사용

 

 

 

논리형, 문자형, 숫자형이 존재

 

숫자형에는 정수형, 실수형

 

전부 달달 외울필요는 없지만 int나 double같이 자주 쓰는 얘들 위주로 쓰다보면 알아서 외워짐

 

 

2-2) 숫자형의 기본

 

자바에서 정수형의 기본은 int

 

실수형의 기본은 double로 지정되어 있다

 

 

2-3) boolean의 크기

 

JVM에 따라 처리하는 방식이 달라서 어떤 곳은 1byte, 어떤 곳은 비워져있고...

 

 

2-4) 실수의 특징

 

부동소수점 방식으로 표현

 

그래서 값을 완벽하게 표현하지 못함

 

어느정도까지 유효자리를 보장하나 그 이후는 오차가 생겨

 

예를 들어 0.1+0.1+0.1 = 0.3과 같냐고 물어보면 다르다고 말함

 

 

3. 변수의 선언

 

3-1) 선언

 

자료형 변수명;

 

예시) int age; , String name;  .......

 

선언하는 순간 아래와 같이 메모리 공간에 변수명을 가진 공간이 생김

 

 

3-2) 저장(할당)

 

변수명 = 저장할 값;

 

예시) age = 30; , name = "철수"; .........

 

저장을 하면 아래와 같이 될 것이다

 

 

기본 자료형인 int의 경우 그냥 바로 공간에 값이 저장

 

하지만 String같은 참조 자료형의 경우, 공간의 크기를 어떻게 만들지 모른다

 

그래서 값을 가리키는 주소를 저장함

 

그리고 그 주소를 따라가보면 "철수"라는 값이 있는거임

 

결론은 기본 자료형은 공간이 실제로 값을 가지고 있고 참조 자료형은 값의 주소를 저장하여, 그 주소를 따라가면 그 값이 존재함

 

3-3) 초기화

 

자료형 변수명 = 저장할 값;

 

예시) int age = 30;

 

선언과 저장을 동시에 하는 행위

 

package java02.variable;

public class Var01_VariableTest {
	public static void main(String[] args) {
		
		int a; //선언
		
		// 변수는 값을 할당하지 않으면 사용 불가능
		a = 10; //저장
		System.out.println(a);
		
		int b = 20;//초기화
		System.out.println(b);
		
		//오른쪽 변수의 값을 꺼내 왼쪽 변수에 담는다
		int c = a;
		System.out.println(c);
		
		c = b;
		System.out.println(c);
		
		System.out.printf("변수 c의 값은 %d", c);
	}

}

10
20
10
20
변수 c의 값은 20

 

기초 자료형에서는 값을 그대로 복사해서 넣는다

 

int c = a;하면 a의 값 10을 c에 넣어주고

 

c = b;하면 b의 값 20을 c에 다시 넣어

 

 

4. 형 변환(type casting)

 

4-1) 자료형의 크기 비교

 

 

크기는 long이 8byte고 float는 4byte인데 왜 long < float?

 

float의 표현 범위가 long보다 상상할 수 없을 정도로 매우 크다

 

short는 음수를 허용하지만 char은 음수를 허용하지 않는다

 

float는 유효 보장 범위가 6자리 double은 15자리 정도라 자바는 기본으로 double을 사용

 

 

4-2) 데이터 형변환

 

1) 묵시적 형변환(implicit casting)

 

자동 형변환

 

범위가 넓은 데이터 형에 좁은 데이터 형을 대입하는 것이다

 

작은 친구가 큰 집으로 이사함

 

2byte짜리 short가 4byte짜리 int에 들어가도 데이터 손실이 전혀 없으므로 int로 변환된다

 

 

2) 명시적 형변환(explicit casting)

 

큰 범위에 있는 친구를 작은 범위에 있는 곳으로 옮길려고 할 때

 

4byte int를 2byte short로 보낼려고 할때, 2byte를 없애야 들어가겠지

 

그래서 데이터의 손실이 존재할 수 있다

 

그런것도 감안하고 형변환을 시킬거야? 하기 위해 형변환 연산자를 사용해야함

 

 

package java02.variable;

public class Var02_TypeCasting {
	public static void main(String[] args) {
		int a = 10;
		int b = a;
		System.out.printf("a : %d \n", a);
		System.out.printf("b : %d \n", b);
		
		a = 12;
		//b는 바뀌나?
		System.out.printf("a : %d \n", a);
		System.out.printf("b : %d \n", b);
		
		//작은 집에서 큰 집으로 이사 갈때는 문제가 없다(묵시적)
		short sa = 32767;
		int c = sa;
		
		//큰집에서 작은집으로 갈때는 형변환 연산자가 필요(명시적)
		short sb = (short) c;
		
		float f = 10;
		// 같은 크기의 집이라도 형변환 연산자가 필요(명시적)
		int g = (int) f;
		
		System.out.println(sa);
	}
}

 

 

 

5. 연산자

 

연산자 우선 순위는 외울 필요는 없고.. 

 

() 씌우면 최우선으로 수행되니까 ()씌우면 그만

 

연산자 우선 순위가 동급이면 당연히 왼쪽부터 오른쪽으로 작성된 순서대로 수행

 

 

5-1) 단항 연산자

 

1) 증감 연산자 ++, --

 

피연산자의 값을 1 증가(++), 감소(--)시킴

 

전위형으로 ++i 앞에 붙이는 경우

 

후위형으로 i-- 뒤에 붙이는 경우 결과가 다르다

 

전위형 ++i는 1을 더해주고 나서 나머지 연산들을 수행

 

후위형 i--는 앞에 나머지 연산들을 수행한 다음에 1을 빼줌

 

 

2) 부호 연산자 +, -

 

숫자가 양수임을 표시하는 +

 

피연산자의 부호를 반대로 변경한 결과를 반환하는 -

 

사실 +는 의미없지.. 안써도 된다 이 말

 

 

3) 논리 부정 연산자 !

 

논리 값을 True를 False로 False를 True로 바꿔줌

 

 

4) 비트 부정 연산자 ~

 

0은 1로 1은 0으로 바꿔줄때

 

 

5) 형 변환 연산자 (type)

 

(int), (short), ... 변수 앞에 (type) 붙여주면 해당 type으로 형변환

 

package java03.operator;

public class Op01_단항연산자 {
	public static void main(String[] args) {
		int a = 5;
		System.out.println( a++ ); //5
		System.out.println( ++a ); //7
		System.out.println( --a ); //6
		System.out.println( a ); //6
		System.out.println( a-- ); //6
		System.out.println( a++ ); //5
		
		System.out.println(-a); //-6
		System.out.println(~a); //-7
		
		System.out.println(!false);
	}

}

5
7
6
6
6
5
-6
-7
true

 

 

재밌는게 System.out.println( a++)가 5가 나오는데...

 

5를 먼저 출력하고 a에는 6이 저장되어 있나보다

 

그러니까 그 다음에

 

System.out.println(++a)는 6에서 1 더해서 7이 나오고.. 출력하니까 7이 나옴

 

 

5-2) 산술 연산자

 

곱하기 *

 

나누기 /

 

나머지 %

 

더하기 +

 

빼기 -

 

 

5-3) 산술 연산 특징

 

정수와 정수의 연산은 정수

 

정수와 실수의 연산은 실수

 

package java03.operator;

public class Op02_산술연산자 {
	public static void main(String[] args) {
		int a = 10;
		int b = 6;
		
		System.out.println(a+b);
		System.out.println(a-b);
		System.out.println(a*b);
		System.out.println(a/b);
		System.out.println(a%b);
		
		System.out.println(a/(double)b);
		System.out.println((double)a/b);
		System.out.println((double)(a/b));
	}
}

16
4
60
1
4
1.6666666666666667
1.6666666666666667
1.0

 

5-4) 비교 연산자

 

대소 비교 연산 >, >=, <, <=

 

동등 비교 연산 ==, !=

 

객체 타입 비교 연산 instanceof

 

대소 비교와 동등 비교 결과는 boolean

 

 

5-5) 비교 연산 특징

 

참고로 파이썬에서는 50 <= a <= 70으로 써도 알아먹는데 자바는 알아먹지 않는다

 

기본적으로 프로그래밍 언어는 위와 같이 비교 연산을 연달아 사용하면 알아먹지 않아

 

50 <= a and a <= 70 이렇게 연결시켜야함

 

그리고 String은 참조형이다보니 ==으로 비교 하기가 조금 별로다?

 

equals() 함수를 사용해야한다

 

package java03.operator;

public class Op03_비교연산자 {
	public static void main(String[] args) {
		int a = 10;
		
		System.out.println(a > 10);
		System.out.println(a != 10);
		System.out.println(a >= 10);
		
		System.out.println(a == 10);
		System.out.println(a != 10);
		
		String c = "Hi";
		String d = "Hi";
		String e = new String("Hi");
		
		System.out.println(c == d);
		System.out.println(c == e);
		System.out.println(c.equals(e));
	}
}

false
false
true
true
false
true
false
true

 

참조자료형은 주소 비교를 하나보다

 

c랑 e가 주소가 달라서 c == e는 false가 나오는듯?

 

c랑 d는 단순히 만든 Hi가 주소가 같나봐.. 그래서 true인가

 

 

5-6) 논리 연산자

 

1) &&(논리 곱)

 

피연산자 모두가 true이면 true

 

2) || (논리 합)

 

피연산자 중 하나라도 true이면 true

 

3) ! (논리 부정)

 

피연산자의 결과를 반대로 바꾼다

 

 

5-7) 단축 평가(short circuit evalutation)

 

예를 들어 A && B를 수행할때,

 

A가 true이면 && 연산은 둘 다 참이어야 참이므로, B도 참인지 거짓인지 확인해야함

 

하지만 A가 false이면 뒤의 B는 확인할 필요도 없이 전체가 거짓이므로, B는 보지도 않고 바로 거짓을 반환함

 

당연히 A || B를 수행할때는...

 

A가 true이면 전체는 true이므로 B는 보지도 않고 바로 true를 반환함

 

그러므로 논리 연산 수행할때, 앞에서 바로 걸러질 수 있게 배치하는것도 실력임

 

package java03.operator;

public class Op04_논리연산자 {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		
		System.out.println(a > 5 && b > 5); //참
		System.out.println(a > 5 && b < 5); //거짓
		System.out.println(a < 5 && b > 5); //거짓
		System.out.println(a < 5 && b < 5); //거짓
		
		System.out.println(a > 5 || b > 5); //참
		System.out.println(a > 5 || b < 5); //참
		System.out.println(a < 5 || b > 5); //참
		System.out.println(a < 5 || b < 5); //거짓
		
		System.out.println(!(a < 5 || b < 5)); //뒤집기, 참
		
	}
}

true
false
false
false
true
true
true
false
true

 

5-8) 삼항 연산자

 

조건식 ? 식1:식2 

 

조건식이 참이면 식1을 수행하고 거짓이면 식2를 수행함

 

조건식, 식1, 식2 3개가 들어가서 삼항 연산자

 

 

5-9) 복합 대입 연산자

 

+= , -=, *=, /=, ...

 

i += 1은 i = i + 1을 줄여서 쓴 것

 

i = 1 + i도 똑같은거 아니냐?

 

하지만 /= 같은 경우

 

i = 5 / i랑 i = i/5랑 결과가 다르잖아

 

뒤쪽에 있는게 뒤로 감

 

그래서 i = i + 1이라고 외우자

 

package java03.operator;

public class Op05_삼항연산자 {
	//조건식 ? 식1 : 식2
	
	public static void main(String[] args) {
		int num = (int)(Math.random()*10)+1;
		
		System.out.println("내가 뭐라고 했더라???");
		System.out.println(num % 2 == 0 ? "짝":"홀");
	}

}

내가 뭐라고 했더라???
홀

 

TAGS.

Comments