TIL

day6 TIL

dalooong 2023. 7. 7. 00:40

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을 형이라고 하기때문에 형변환이라고 한다.

 

자동형변환

  1. 더 작은 데이터 타입에서 더 큰 데이터 타입으로 변환하는 것 (자동으로 일어남)
  2. 데이터 손실없음

ex) int → long, float → double

 

수동형변환

  1. 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환하는 것 (명시적으로 지정해주어야함)
  2. 데이터 손실 가능

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.51.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 실행 과정
    1. Commit → 마우스 우클릭 → “Show Diff”
    2. 이전 버전과 변경사항 확인하기
  • 롤백 단축키
    • 윈도우
      • 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
  • 예를 들면 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을 형이라고 하기 때문에 형 변환이라고 한다.

  • 자동 형 변환
  1. 메모리 크기가 작은 데이터 타입에서 더 큰 데이터 타입으로 변환하는 것 (자동으로 일어남)
  2. 데이터 손실 없음

ex) int → long, float → double

  • 수동 형 변환
  1. 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환하는 것 (명시적으로 지정 해 주어야 함)
  2. 데이터 손실 가능

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.51.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)을 형이라고 하기 때문에 형변환이라고 한다.

  • 자동형변환
    1. 더 작은 데이터 타입에서 더 큰 데이터 타입으로 변환하는 것 (자동으로 일어남)
    2. 데이터 손실 없음
    3. ex) int → long, float → double
  • 수동형변환
    1. 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환하는 것 (명시적으로 지정 해 주어야 함)
    2. 데이터 손실 가능
    3. 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)

순서도 예시 이미지

: 문자열이나 데이터를 의미 있는 부분으로 분석하고 구조화하는 과정을 말한다.