day6 TIL
23.04.24 월
원시타입과 참조타입
-원시타입: int, float, double, char 등 소문자로 시작함
-참조타입: String 등 대문자로 시작함
- 변수명을 정할 때에는 a.b,c,s,i,f 등과 같은 외자는 피하는게 좋음. 변수명만 보고도 코드들을 예상할 수 있는 변수명이 좋다.
Rollback
: 수정 사항을 git repository에 마지막 저장된 내용으로 돌리는 것
<사용 방법>
Commit → 우측 클릭 → Show Diff
이전 버전과 변경사항 확인하기
ctrl + alt + z
롤백과 Delete는 다른 것.
롤백 - 수정사항만 버림
지우기 - 파일을 지움
float fOne = 1.0f; → f 안붙이면 기본값은 double로 인식하기 때문에 f를 붙여야한다
가운데 인덱스 구할 때는 배열의 길이 / 2로 (소수점날림) 정함
1/2의 결과가 0.5로 나오게 하려면 정수 1대신 1.0/2를 해야 한다. 왜냐하면 1.0은 실수로 인식하기 때문에 소수점이 버림이 일어나지 않고 0.5로 출력 된다.
Float
부동 소수점, 32bit, 숫자 뒤에 f를 붙임, 대략 7자리의 정밀도→ %f로 출력 했을 때 소수점 6자리까지 출력
Double
64bit, float보다 더 큰 값을 표현할 수 있고, 더 높은 정밀도를 가진다. 대략 15자리의 정밀도
하지만, 메모리 사용량이 더 많으므로 사용할 데이터의 크기와 정확도에 따라 선택 해야 한다.
*메모리를 효율적으로 사용하지 않으면 애플리케이션의 성능이 떨어지고, 많은 문제들이 추가로 발생할 수 있다.
// float 변수 선언 및 초기화, 숫자 뒤에 f를 붙인다.
float f1 = 3.14f;
float f2 = 1.23e10f;
// double 변수 선언 및 초기화
double d1 = 3.141592653589793;
double d2 = 1.23e100;
// 실행결과
f1 = 3.14
f2 = 1.23000003E10
d1 = 3.141592653589793
d2 = 1.23E100
result1 = 6.28
result2 = 1.5707963267948966
부동소수점
314,600,000
3억 1천 4백-60만 → 3146E5
3146(가수부)E5(지수부)
가수부 지수부
가수부 | 지수부 |
3146 | 00000 |
E5 |
E = 10^n
부동 소수점
Concat
: 문자열끼리 더하면 + 연산을 하는 것이 아니라 합치는 연산을 한다.
100+200 = 300이 아니라 100200이 출력됨
“1” →문자열 “” 로 감싸져 있으므로 문자열
1 → 숫자 → 큰따옴표가 없기때문에
java 기준 String > int
System.out.println("1" + 1);
// 11로 출력
int result = 1 + “1”;
// 에러
String result = 1 + "1";
//11 출력
이유? 큰쪽으로는 자동형변환을 하지만, 작은쪽에서는 수동으로 형변환을 해야함
타입 캐스팅(Casting) = 형변환
: 변수를 하나의 데이터 타입에서 다른 데이터 타입으로 변환하는 것
타입Type을 형이라고 하기때문에 형변환이라고 한다.
자동형변환
- 더 작은 데이터 타입에서 더 큰 데이터 타입으로 변환하는 것 (자동으로 일어남)
- 데이터 손실없음
ex) int → long, float → double
수동형변환
- 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환하는 것 (명시적으로 지정해주어야함)
- 데이터 손실 가능
ex) double → int, long → short
강제로 형을 변환하는 것
double 타입인 dVal을 int 타입으로 강제 형변환 후 ,그 결과를 int 타입인 iVal 변수에 저장.
이때 double 타입인 dVal 값 123.456은 int 타입으로 형변환 하면 소수점 이하의 값을 잃어버리므로 int 타입으로 형변환 값은 123이 출력됨
예제)
// 강제로 형을 변환해주는
public class NarrowingCasting {
public static void main(String[] args) {
double dVal = 123.456;
// double 타입인 d를 int 타입으로 강제 형 변환
int iVal = (int) dVal;
System.out.println("dVal = " + dVal);
System.out.println("iVal = " + iVal);
}
}
//dVal = 123.456
//iVal = 123 출력
문자열을 숫자형으로 변환
실수형으로 변환 Float.parseFloat() / Double.parseDouble()
package week2.day6;
public class FloatNumParse {
public static void main(String[] args) {
String val1 = "1.5";
String val2 = "2.5";
float result = Float.parseFloat(val1) + Float.parseFloat(val2);
System.out.println(result);
}
}
문자열을 float 타입으로 형변환 후 계산
public class FloatPlus {
public static void main(String[] args) {
String val1 = "1.11111111"; // 소수점 여덟 자리
String val2 = "2.11111111"; // 소수점 여덟 자리
float result = Float.parseFloat(val1) + Float.parseFloat(val2);
System.out.println(result);
}
}
//3.2222223출
파싱
: 문자열이나 데이터를 의미있는 부분으로 분석하고 구조화하는 과정을 말한다.
Integer.parseInt(); → () 안에 문자열을 숫자형으로 구조화 해주어 1 + 1 이 11가 아닌 2가 나오게 해줌
Float.parseFloat (); () 안에 문자열을 float형으로 구조화 해주어 1.5+2.5가 1.42.5가 아닌 4.0이 나오게 해줌
boolean 타입
: 1bit, true와 false로 저장
- flow chart
: 순서도
= 여기에서 ‘잔액이 충분한가?’, ‘결제가 됐는가?’와 같은 특정 조건을 만족했는지 여부인 true, false를 저장하는 타입이 boolean
-boolean타입은 true와 false 두개의 값을 가지며,
boolean flag1 = true;
boolean flag2 = false;
*타입선언시에는 변수명에 is를 붙여 시작한다
boolean isBlanceSufficient = true; //잔액이 충분하니?
boolean isPaymentSucess = false; //결제 성공했니?
== 비교 연산자, 왼쪽과 오른쪽이 같니
Rollback (Git)
Rollback이란? 수정 사항을 git repository의 마지막에 저장된 내용으로 돌리는 것
- Rollback 실행 과정
- Commit → 마우스 우클릭 → “Show Diff”
- 이전 버전과 변경사항 확인하기
- 롤백 단축키
- 윈도우
- Show Diff : ctrl + d
- Rollback : **ctrl + alt + z**
- 맥OS
- Show Diff : cmd + d
- Rollback : **cmd + opt + z**
- 윈도우
- 롤백과 Delete는 다른 것.
- 롤백 - 수정사항만 버림
- 지우기(Delete) - 파일을 지움
- 질문사항 : add하고 commit 하기 전 시점에서만 rollback이 가능한 건가? → commit 후에는 rollback이 불가능하다.
- 이전 commit 으로 가는 기능이 있음. 덮어 씌우는 방법 (tagging 방법)
- 이전 commit 으로 branch 딴 후 그 branch를 다시 main에 merge → 요즘은 보통 Docker로 한다.
원시타입(Primitive)과 참조타입(Reference)
- 원시타입(Primitive)과 참조타입(Reference)
- 원시타입: int, float, double, char 등 소문자로 시작함
- 참조타입: String, 클래스(Class) 등이 해당하며 대문자로 시작함 변수에 값이 아니라 주소가 저장되기 때문에 참조 타입이라고 한다.
변수명을 정할 때에는 a,b,c,s,i,f 등과 같은 외자는 피하는게 좋으며, 변수명만 보고도 코드들을 예상할 수 있는 변수명이 좋다.
String은 앞에서 우리가 만든 PrintHello와 같은 객체 (Object, 오브젝트)
String name = "13일의금요일";// primitive타입 쓰듯이 초기화 -> 추후에 생긴 기능
String name2 = new String("13일의금요일");//원래 String의 모습
( )안에 들어가는 것은 파라미터
String 에 대한 질문 - 네이버 인성면접 볼 때 나왔던 질문.
String sOne = new String("1");
intiOne = 1;
floatfOne = 1.0f;
모두 다 1이지만 서로 타입이 각각 다름.
원시타입의 종류원시 타입의 종류 이미지
Java에서 1 + 1 / 2 의 결과는? 1.5 vs 3 vs 2
→ float형으로 계산 = 1.500000
→ int형으로 계산 = 1 ⇒ int의 경우는 소수를 버림. 반올림❌
홀수를 2로 나눌 때 int로 처리 할 수 없는 경우가 생긴다.
- 정확히는 처리 할 수 없는 것은 아니고 type을 바꿔서 표현해야 하는 경우가 생긴다.
- 소수점 연산을 하고 싶을 때는 int로 불가능 하기 때문에 float을 사용한다.
Float과 Double
float은 floating point에서 유래되었습니다. floating point를 번역한 말은 '부동 소수점'으로 소수점이 둥둥 떠다니는 것 같기 때문에 floating point라는 이름이 붙게 되었다.
- 부동 소수점'에서 '부동'의 한자는 浮動입니다. 한자 浮(부)는 '뜰 부'. 변한다 둥둥 떠다닌다는 뜻.
- 부동 소수점 부분을 **가수부(mantissa)**라고도 한다.부동 소수점 기수법에서 **어떤 수(n)**이 **가수부 (a)**와 **지수부(b)**로 표현되면 $n=a×rb$(r = 기수)가 된다.
-
- 3146(가수부)E5(지수부) ⇒ 컴퓨터에서 수를 표현하는 방식 : 부동 소수점 방식가수부 지수부
3146 00000 E5
- 3146(가수부)E5(지수부) ⇒ 컴퓨터에서 수를 표현하는 방식 : 부동 소수점 방식가수부 지수부
- 예를 들면 10진수 314,600,000과 0.0000451은 각각 3,146E5와 451E-7로 표현되는데 3,146과 451은 가수부이고 E5와 E-7은 지수부이다. 따라서 314,600,000=3,146×10^5가 되고, 0.0000451=451×10-7이 된다.
- 가수부는 그 수의 숫자 부분을 지정하고 지수부는 그 수의 크기**(소수점의 위치)**를 지정.
- float : 32비트의 크기의 실수 타입
- 1비트는 부호(+인지 -인지를 구분)를, 8비트는 지수를, 23비트는 가수를 나타내는 데 사용됩니다. 이로 인해 float은 대략 일곱 자리의 정밀도를 가짐
- → 1.000000 (%f로 출력했을때 소수점 6자리로 출력된다)
- float f2 = 1.23e10f; 는 한글로 쓰면 몇일까요?*float* fOne = 1.0f; *// float은 초기화 값 뒤에 f를 붙어줘야함 아니면 double로 인식*f 를 붙였을 때 6자리를 초과하면 반올림 되어 출력 된다.
- 변수 선언 및 초기화 시 뒤에 f는 언제 붙이는 건가요? → 소수로 초기화할 때 사용
- = 123억
- double : 64비트의 크기의 실수 타입. float보다 더 큰 값을 표현할 수 있고, 더 높은 정밀도를 가진다
- 1비트는 부호를, 11비트는 지수를, 52비트는 가수를 나타내는 데 사용된다. 이로 인해 double은 대략 15자리의 정밀도 “1.00000000000000”
- 하지만, 메모리 사용량이 더 많으므로 사용할 데이터의 크기와 정확도에 따라 선택 해야 한다.
- 메모리를 효율적으로 사용하지 않으면 애플리케이션의 성능이 떨어지고, 많은 문제들이 추가로 발생할 수 있다.
// float 변수 선언 및 초기화, 숫자 뒤에 f를 붙인다. float f1 = 3.14f; float f2 = 1.23e10f; // double 변수 선언 및 초기화 double d1 = 3.141592653589793; double d2 = 1.23e100; // 실행결과 f1 = 3.14 f2 = 1.23000003E10 d1 = 3.141592653589793 d2 = 1.23E100 result1 = 6.28 result2 = 1.5707963267948966
- Double을 써야하는 경계
- float의 자릿수가 넘어가면 double로 선언하기
Concat
: 문자열끼리 더하면 “+” 연산을 하는 것이 아니라 합치는 연산을 한다.
100+200 = 300이 아니라 100200이 출력 됨
- “1” = 문자열(String형) → “”로 감싸져 있으므로 문자열로 인식
- 1 = 숫자(int형) → 큰따옴표가 없기 때문에 숫자로 인식.
- java 기준 String > int <aside> 💡 why? 메모리 크기가 큰 쪽으로는 자동형변환을 하지만, 작은 쪽으로는 수동으로 형 변환을 해야 함
System.out.println("1" + 1); // 11로 출력 int result = 1 + “1”; // 에러 String result = 1 + "1"; //11 출력
- </aside>
타입 캐스팅(Casting) = 형 변환
: 변수를 하나의 데이터 타입에서 다른 데이터 타입으로 변환하는 것,
타입Type을 형이라고 하기 때문에 형 변환이라고 한다.
- 자동 형 변환
- 메모리 크기가 작은 데이터 타입에서 더 큰 데이터 타입으로 변환하는 것 (자동으로 일어남)
- 데이터 손실 없음
ex) int → long, float → double
- 수동 형 변환
- 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환하는 것 (명시적으로 지정 해 주어야 함)
- 데이터 손실 가능
ex) double → int, long → short
- 강제로 형을 변환하는 것
double 타입인 dVal을 int 타입으로 강제 형 변환 후 ,그 결과를 int 타입인 iVal 변수에 저장.
이때 double 타입인 dVal 값 123.456은 int 타입으로 형 변환 하면 소수점 이하의 값을 잃어버리므로 int 타입으로 형 변환 값은 123이 출력 됨.
예제)
// 강제로 형을 변환해주는
public class NarrowingCasting {
public static void main(String[] args) {
double dVal = 123.456;
// double 타입인 d를 int 타입으로 강제 형 변환
int iVal = (int) dVal;
System.out.println("dVal = " + dVal);
System.out.println("iVal = " + iVal);
}
}
//dVal = 123.456
//iVal = 123 출력
- 실수 형으로 변환 Float.parseFloat() / Double.parseDouble()
package week2.day6;
public class FloatNumParse {
public static void main(String[] args) {
String val1 = "1.5";
String val2 = "2.5";
float result = Float.parseFloat(val1) + Float.parseFloat(val2);
System.out.println(result);
}
}
- 문자열을 float 타입으로 형 변환 후 계산
public class FloatPlus {
public static void main(String[] args) {
String val1 = "1.11111111"; // 소수점 여덟 자리
String val2 = "2.11111111"; // 소수점 여덟 자리
float result = Float.parseFloat(val1) + Float.parseFloat(val2);
System.out.println(result);
}
}
//3.2222223출력
파싱이란?
Integer.parseInt(); → () 안에 문자열을 숫자 형으로 구조화 해주어 1 + 1 이 11가 아닌 2가 나오게 해줌
Float.parseFloat (); → () 안에 문자열을 float형으로 구조화 해주어 1.5+2.5가 1.52.5가 아닌 4.0이 나오게 해줌
- 문자를 숫자로
왜 int 에 넣으려고 하면 에러가 나고
String 에는 잘 들어가는지?
Java기준 String > int 로 입력 되어 있기 때문
큰쪽으로는 자동으로 해주는데
작은쪽으로는 수동으로 해야 합니다.
1.5를 int, float, double이 담아두는 방법
1.5 1.5 1.5
int | → | float | → | double |
1 | 1.500000 | 1.500000000000000 | ||
1 | 1.5e-6 | 1.5e-15 | ||
소수점 버림 | 소수점 6자리 | 소수점 15자리 |
변수를 하나의 데이터 타입에서 다른 데이터 타입으로 변환하는 것 타입(Type)을 형이라고 하기 때문에 형변환이라고 한다.
- 자동형변환
- 더 작은 데이터 타입에서 더 큰 데이터 타입으로 변환하는 것 (자동으로 일어남)
- 데이터 손실 없음
- ex) int → long, float → double
- 수동형변환
- 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환하는 것 (명시적으로 지정 해 주어야 함)
- 데이터 손실 가능
- ex) double → int, long → short
- 강제로 형을 변환하는 것 : double 타입인 dVal을 int 타입으로 강제 형변환 후 ,그 결과를 int 타입인 iVal 변수에 저장. 이때 double 타입인 dVal 값 123.456은 int 타입으로 형변환 하면 소수점 이하의 값을 잃어버리므로 int 타입으로 형변환 값은 123이 출력됨
- // 강제로 형을 변환해주는 public class NarrowingCasting { public static void main(String[] args) { double dVal = 123.456; // double 타입인 d를 int 타입으로 강제 형 변환 int iVal = (int) dVal; System.out.println("dVal = " + dVal); System.out.println("iVal = " + iVal); } } //dVal = 123.456 //iVal = 123 출력
- 실수형으로 변환 Float.parseFloat() / Double.parseDouble()
- package week2.day6; public class FloatNumParse { public static void main(String[] args) { String val1 = "1.5"; String val2 = "2.5"; float result = Float.parseFloat(val1) + Float.parseFloat(val2); System.out.println(result); } }
boolean 타입
: 1bit, true와 false로 저장
- boolean 타입은 true와 false 두개의 값을 가지며, 타입 선언 시에는 변수 명에 is 를 붙여 시작한다 .
boolean flag1 = true;
boolean flag2 = false;
boolean isBalanceSufficient = true; // 잔액이 충분한지?
boolean isPaymentSuccess = false; // 결제가 되었는지?
순서도 (Flow Chart)
순서도 예시 이미지
: 문자열이나 데이터를 의미 있는 부분으로 분석하고 구조화하는 과정을 말한다.