1. 저번 수업 리뷰
1.1 프로젝트 만들기
new 자바 프로젝트 -> new 패키지 -> new 클래스
1.2 실행문(Statement)
변수선언, 변수값 저장, 메서드 호출.
실행문 끝에는 ;로 끝났음을 표시
1.3 출력문(Output Statement)
System.out. + println(); : 자동개행
System.out. + print(); : 자동개행x
System.out. + printf(); : 서식문자를 이용해 출력, 자동개행x ,로 구분해 순차적으로 값을 대입해 출력.
ex.
System.out.printf("원주율은 정수로는 약 %d이고 실수로는 약 %.2f입니다. "
+ "영어로는 먹는 %s가 아닌 %s로 표시합니다.", 3, 3.14, "pie", "pi");
*서식문자 종류 암기 必!
1.4 변수 선언규칙, 변수 표기법
-메모리에 값을 저장해두는 특정한 공간. 수는 계속 변할 수 있으며 필요할 때 마다 메모리에서 꺼내쓴다.
변수 선언 형식: 자료형 변수이름;
규칙 : 변수에 예약어는 사용할 수 없고, 숫자로 시작할 수 없다. 또한 대소문자를 구분한다.
표기법 -
(1)카멜 : 맨처음은 소문자, 다음부턴 대문자 (carNumber)
(2)파스칼 : 맨 첫글자는 모두 대문자 (CarNumber)
(3)헝가리안 : 변수명 앞 데이터타입 표기 (strCarNumber)
(4)팟홀 :단어사이 언더바 (car_number)
2.변수(Variable)
2.1 변수에 데이터 입력하기
변수 선언& 데이터 저장(=초기화) : 자료형 변수이름 = 값;
Ex.
public class Example_11 {
public static void main(String[] args) {
String name;
name = "ShinyDev"; //변수 선언 따로, 대입 따로
int age = 80; //선언+초기화 한번에
char bloodType = 'O';
System.out.printf("\n나의 이름은 %s이고 나이는 %d이며, 혈액형은 %c입니다", name, age, bloodType);
println으로 한다면?
System.out.println("\n나의 이름은 " +name +"이고 나이는 " + age +"이며, 혈액형은 " + bloodType + "입니다");
로 문장과 변수를 '+'로 붙여준다. 코드 작성의 용이성은 printf가 더 좋지만, 만약 문장이 길어진다면 가독성은 떨어질 듯 하다.
만일 변수에 값을 대입하지 않고 써먹는다면?
int home;
System.out.println(home);
The local variable home may not have been initialized
홈이라는 로컬변수가 초기화되지 않았다는 에러가 뜬다.
이런 오류가 뜨면 값을 대입하지 않은 변수가 있는지, 또는 잘못 입력한 변수가 있는지 체크.
2.2 다른 변수에 복사하기.
int myAge = 20;
int yourAge = myAge
이러면 yourAge에 myAge의 값이 복사되었다.
System.out.println(yourAge);
를 하면 myAge값, 20이 출력된다.
이를 이용하면 아래를 할 수 있다.
2.3 2개의 변수 데이터 바꾸기.
방법은 간단하다.
변수1과 변수2의 데이터를 서로 바꾸기 위해서는 임시변수를 하나 생성하고, 임시 변수에 변수1값을 대입한다.
그리고 변수1에 변수 2값을 대입, 변수2에 임시변수(=변수1의 값)을 대입한다.
public class review_03 {
public static void main(String[] args) {
String plateA = "파스타";
String plateB = "스테이크";
String plateNew;
plateNew = plateA;
plateA = plateB;
plateB = plateNew;
System.out.println(plateA);
System.out.println(plateB);
}
}
기존 파스타가 담긴 A접시와 스테이크가 담긴 B접시에서,
새접시를 꺼내서 옮겨담은 후 서로 그릇을 바꿨다.
2.4 변수의 사용 범위
변수는 선언되는 중괄호 {} 안에서만 사용가능하다.
만약 if문의 중괄호 안에서 선언된 변수라면, if문을 벗어나서는 사용하지 못한다.
함수 안에서 선언된 변수는 지역변수라고 부른다. 지역화폐인 동백전을 서울에서 사용할 수 없다고 이해하면 쉬울 듯 하다.
ex.
public class review_03 {
public static void main(String[] args) {
if(true) {
int n = 5;
}
System.out.println("변수 n의 값 : " +n);
}
}
을 출력하면
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
n cannot be resolved to a variable
at ex02.example_03.main(review_03.java:9)
와 같은 에러가뜬다. 대충 9번째 줄에서 선언한 변수('n')를 참조하지 못했다는 소리.
변수 선언을 메인메서드 안에서 하거나, 변수 사용을 if문 안에서 사용하면 해결된다.
3.자료형(DataType)
변수를 선언할 때 지정해주는 변수 값의 형태. 모든 변수에는 자료형이 존재한다.
자료형에 따라 값의 '형태'와 '크기'가 정해진다.
3.1 기본 자료형(Primitive Types)
실제 데이터값을 저장. 정수형(5), 실수형(2), 논리형(1) 총 8가지.
3.1.1 정수형(Integer Types)
byte - short - int - long
=1byte - 2byte -4byte - 8byte
=~2^7-1 / ~2^15-1 / 2^31-1 / 2^63-1 음수포함시 2^8, 2^16, 2^32, 2^64만큼의 양을 처리하는 것.)
1byte = 8bit = 2^8 / 2byte = 16bit = 2^16 / 4byte = 32bit = 2^36 = 2진수 기준으로 표현가능한 숫자의 갯수
-만약 범위를 초과하는 데이터를 저장하면?
byte value = 128;
Type mismatch: cannot convert from int to byte
라는 오류발생. (왜 byte to int가 아니지..?)
자바에서는 연산작업을 수행할 때 4byte를 기본단위로 사용하기때문에 byte나 short을 int로 변환한 후 실행한다.
그러면 어차피 int로 전환할 거 굳이 왜 byte나 short같은 형태를 사용하나?
->"데이터 그 자체"에 더 집중해야할 때가 있기 때문. byte타입의 경우는 색상 정보 및 파일 또는 이미지 등의 이진(Binary) 데이터를 처리할 때 사용한다고 한다.
*Long타입의 경우,
'int형 범위를 벗어난' long 타입의 큰 정수를 표현하고자 하면
숫자 뒤에 소문자l이나 대문자L을 반드시 붙혀야한다!
ex. l을 붙이지 않으면?
long num = 2147483648;
The literal 100000000000 of type int is out of range
라는 에러가 뜬다.
long num = 2147483648L;
long num2 = 2147483647;
System.out.println(num);
System.out.println(num2);
L을 붙여주면 아래와 같이 출력된다.
num2의 경우 INT형의 범위를 벗어나지 않았기 때문에 L을 붙이지 않더라도 출력이 된다.
쓸 일이 얼마나 있을 지 모르겠지만, 소문자 l을 사용할경우 1과 헷갈리니까 대문자 L을 사용해야 할 듯 하다.
*입력은 2진수, 8진수, 16진수도 가능하나 출력은 전부 10진수,
ex, 변수에 0110 / 0x46을 입력시 -> 10진수인 72, 70으로 출력.
3.1.2 실수형(Floating-Point Types)
float - double
4byte - 8byte
소수점 7자리- 15자리 까지 표현. (float에 비해 정밀도가 2배라서 double)
ex.
public class review_03 {
public static void main(String[] args) {
float pieFloat = 3.141592653589793f;
double pieDouble = 3.14159265358979323;
System.out.println(pieFloat);
System.out.println(pieDouble);
->float는 소수점 7자리까지, double은 17자리를 입력했지만 15자리까지 출력이 된다.
정수형에서는 연산작업을 할 때 int형으로 자동변환되었는데, 실수형에서는 double형으로 자동변환된다.
이 점 때문인지는 몰라도 float형에서는 반드시 숫자뒤에 식별자 'F'나 'f'를 붙여줘야한다.
-만일 f를 붙이지 않으면?
float halfMarathon =21.0975;
Type mismatch: cannot convert from double to float
라는 오류가 뜬다. f를 붙이면 정상적으로 선언된다.
정수는 int, 실수는 double을 기본으로 사용하는 걸 권장한다고 한다.
3.1.3 문자형(Character Type)
char : 한 문자만 표현가능.
=1~2byte -> 자바에서는 유니코드를 사용하기 때문에, 1byte가 아닌 2byte. 다만 문자에 따라서 1byte.
이때, 문자 그대로를 저장하는 게 아니라 유니코드라는 숫자로 값을 변환해 저장한다. 따라서 char는 문자형인 동시에 정수형이라고도 부른다.
마찬가지로 A라는 값(유니코드 : 65)을 저장하면 65란 값으로 char에 대입된다.
그래서 문자를 유니코드에 맞는 정수로 출력할 수도 있고, 숫자를 문자로 출력할 수도 있다.
ex.
char ga = '가';
System.out.println(ga);
-> 문자 '가'출력.
int korean1 = '가';
System.out.println(korean1);
-> '가'의 유니코드 값 출력.
char na = 45208;
System.out.println(na);
-> 45208에 맞는 문자(=나) 출력.
다른 자료형과 달리, char를 쓸때는 따옴표 ''를 사용하여 변수를 선언해야함!
3.1.4 논리형(Boolean Type)
boolean : true와 false값을 저장.
true, false가 아닌 다른 값은 저장하지 못한다. True도 안되고, False도 안된다.
그래서 실제로 필요한 메모리는 1bit지만 최소크기가 1byte이기에 1byte로 저장된다.
논리값을 저장하는 만큼 if문에서 활용된다고 한다.
public class Review_08 {
public static void main(String[] args) {
boolean isStudent = true;
if(isStudent) {
System.out.println("학생입니다");
} else {
System.out.println("학생이 아닙니다.");
}
3.2 참조자료형(Reference Types)
3.2.1 기본 개념
메모리에는 Stack영역과 Heap영역이 있는데, 기본자료형은 Stack영역에 실제 데이터를 직접 저장한다.
하지만 참조자료형은 Heap영역에 데이터를 저장하고 Stack 영역에는 Heap영역의 참조값(주소값)을 저장한다. 그래서 '참조자료형'이다.
*heap영역에서는 '객체'와 '배열'이 생성, 참조하는 변수가 없으면 쓰레기 값으로 취급한다. JVM에서는 '가비지컬렉터'를 실행해 불필요한 메모리를 차지하는 객체를 제거한다.
3.2.2 String(문자열)
형식 1. String hi = "안녕하세요";
형식 2. String great = new String("훌륭해");
-> 왜 new String? -> '클래스'라는 단원에서 배운다고 한다.
기본자료형과 다르게 첫 글자가 대문자로 시작. (카멜) ->클래스와 타입의 구분을 명확하게 하기위함.
4.형변환(Type Casting)
4.1 개념 / 자동형변환(Implicit) / 강제형변환(Explicit)
모든 연산은 같은 자료형끼리만 수행 가능하다. 따라서, 서로 다른 자료형과 연산하려면 형변환을 거쳐야한다.
다만, 크기가 작은 자료형에서 큰 자료형으로, 또는 정수형에서 실수형으로는 자동으로 변환이 일어난다.
하지만 크기가 큰 자료형에서 크기가 작은 자료형으로, 또는 실수형에서 정수형으로는 반드시 형변환이 필요하다.
ex.
//long to int (형변환x)
int num1 = 3;
long num2 = 5;
int result = num1*num2;
System.out.println(result);
//float to int (형변환x)
int num3 = 10;
float num4 = 3.14f;
int result2 = num3*num4;
System.out.println(result2);
}
}
Type mismatch: cannot convert from long to int
Type mismatch: cannot convert from float to int
라고 오류가 발생한다.
result값의 자료형을 더 큰 long / float으로 바꾸거나(1)
num2와 num4를 형변환 시켜주면 해결된다.(2)
하지만 (2)를 보면 실수형을 정수형으로 변환시켰기에 소수점 아래 데이터는 손실된다.(float to int)
또한, 크기가 큰 자료형에서 작은 자료형으로 변환하게되면 데이터 손실이 발생한다.
//int to byte 형변환
int num5 = 128;
byte num6 = (byte) num5;
System.out.println(num6);
정수형의 경우 최대범위를 넘어서면 -부터 다시센다. byte는 -128부터 127까지라서, 127까지 세고 -128부터 다시센다. 따라서 결과값은 -128이 출력된다.
같은 방법으로 실수형, double에서 float을 연산시키면?
double num1 = 10e100;
float num2 = (float) num1;
System.out.println(num2);
double num3 = 10e-100;
float num4 = (float) num3;
System.out.println(num4);
float형의 범위 안의 값이지만,
float가 표현할 수 있는 소수점을 벗어나면 정밀도에서 차이가 난다.
//범위 안
double d1 = 9.12345;
float f1 = (float) d1;
System.out.println(d1);
System.out.println(f1);
//범위 밖
double d2 = 9.123456789;
float f2 = (float) d2;
System.out.println(d2);
System.out.println(f2);
float으로 형변환을 해주더라도 float 범위 밖의 숫자는 손실되었다.
자동형변환, 강제형변환 같은 명칭보다는 이해하려고 하다보니까 오히려 더 헷갈린다.
그래서
4.2 최종정리!
(1)크기가 작은 -> 큰 자료형 : 자동 형변환 (ex. byte to int, float to double, int to double 등)
(2)크기가 큰 자료형 -> 자료형인 경우 : 형변환 필수, 안하면 에러발생(long to int, float to int 등)
(3)위 경우에서 형 변환을 하더라도 자료형의 범위를 초과할 때에는 데이터 손실 발생.
(실수형, 즉 double to float의 경우 정상 or 0.0 or 무한 or 소수점에서의 정밀도 차이가 난다.
정수형, 즉 long to int의 경우 엉뚱한 수나옴.)
어쩌다보니 교과서에서 형변환-자동형변환-강제형변환으로 나눠놓은 내용을,
내가 이해한대로 세줄로 정리하게 되었는데 오개념이 있을지도 모르겠다.
'Back-End > Java' 카테고리의 다른 글
자바 Servlet 기초 예제(doGet : 데이터 조회) (0) | 2023.08.31 |
---|---|
JDBC 사용하기(Java + MySQL) 쿼리날려보자! (0) | 2023.07.27 |
mySQL과 Java 연결하기(JDBC 라이브러리) (0) | 2023.07.26 |
for문, if문만 이용해 소수 찾는 프로그램 만들기 (기록용) (0) | 2023.05.27 |
Scanner(데이터 입력), 연산자 (0) | 2023.05.25 |
실행문, 출력문, 변수 (0) | 2023.05.14 |