2023.05.23.화.TIL

heeh·2023년 5월 23일

TIL

목록 보기
7/82
post-thumbnail

1-6 참조형변수타입 및 래퍼클래스타입 실습

참조형 변수

  • 단일 공간에 담을 수 없는 복잡한 녀석 - 너무 크기 때문에 크기와 길이를 예측 할 수 없음

문자열 변수 : String

  • 하나 이상의 문자형, 단어가 저장된 형대
    • ex) “Apple”, “텍스트”

그 외 : Object, Array, List …

  • 단일 공간에 저장 할 수 없어서 별도로 빼놓은 공간에 대한 주소값을 저장하는 참조형 변수

래퍼 클래스 변수

  • ‘wrap’ 기본형 변수를 클래스로 감싸는 것
    • 기본형 : boolean, int, byte …
  • 래퍼 클래스 표 확인 필요
  • int를 감싼 Integer, Integer에서 제공하는 많은 메소드들 사용이 가능

(1) boolean 변수를 선언해보자 → 타입 이름 = 값;

  • boolean은 true or false
  • boolean flag = true;
    • boolean flag;
    • flag = true;
  • final boolean flag = true;
    • final이 붙으면 이후에 flag의 값 변경/할당 불가
  • boolean tag = true; 값을 줬지만 밑에 false로 변경 돼서 println으로 false 출력

(2-1) 문자형 char

  • char alphabet = 'A';
    • “ “는 문자열로 인식하기 때문에 ‘ ‘로 표기
  • sout + 엔터 = System.out.println();
  • 출력
    char alphabet = 'A';
    System.*out*.println(alphabet);

(2-2) 정수형 byte, short, int, long(L)

  • byte bytenumber = 127;
    • 변수, 메서드 이름을 만들 때 → byteNumber 이런식으로 표현하는 것을 CamleCase
    • CamleCase : 낙타 등의 혹이 볼록 솟았다
  • 코드 & 출력
    public class Main {
    	public static void main(String[] args) {
    		// 우리의 playground!
    			byte byteNumber = 127;
    			short shortNumber = 32767;
    			int intNumber = 2147483647;
    			long longNumber = 2147483647L;
    
    			System.*out*.println(byteNumber);
    			System.*out*.println(shortNumber);
    			System.*out*.println(intNumber);
    			System.*out*.println(longNumber);
    			}
    	}
  • 1byte = 8bit
    • bit : 0과 1을 표현하는 최소 단위
    • 8개의 자리가 있는 8bit

(3) 실수형

  • float(4byte), double(8byte)
  • 출력 (변수를 할당하고 뒤에서 쓸 수 있다 = 변수를 참조한다)

참조형

  • (1) 참조형 변수의 첫번째 문자열 변수

    • 출력 & 코드
      public class Main {
      	public static void main(String[] args) {
      		// 우리의 playground!
      		String hiwow = "goodgirl";
      		System.*out*.println(hiwow);
      		}
      }
  • (2) 배열

    • 참조형 데이터는 어떠한 주소값을 저장(출력)한다

    • 실제 어떤 값을 출력하고 싶다면? → Arrays(Java가 제공하는 유틸리티)

      • Array를 String으로 바꿔주는 toString 기능 이용하기

래퍼 클래스(Wrapper Class 변수)

int number = 21;
Integer num = new Integer(number);
Integer num = number;
  • new 키워드를 이용해서 Integer로 감싸지 않아도 할당 가능
    • = 필요한 변수를 그대로 가져와도 가능
  • 출력
  • intValue()

1-7 숫자와 문자(ascii)

아스키 코드

  • 데이터를 저장할 때 0, 1로 저장
  • 문자 abc 이런 것들을 0과 1을 숫자로 바꿔(이진수를 십진수로)서 0~1을 표현해보자?
    • 매핑 정보를 가지고 있는 시스템을 이용 → 아스키 코드
    • 아스키 코드 : 숫자를 문자로, 문자를 숫자로 매핑하는 것, 각각을 변환

import java.util.Scanner;

  • import = im(in) + port(항구)
    • Main.java라는 코드 안쪽으로 바깥에서부터 어떤 리소스를 가지고 오는 것
  • Scanner : 실행 시킨 후 콘솔창에 입력한 값을 저장하게 함

형변환

  • 숫자를 문자로 바꾸는 식이 있다 ex) 97 → a = char

  • 문자를 숫자로 바꾸는 식이 있다 ex) a → 97 = int

1-8 변수타입(심화)

문자와 문자열

  • 보통 문자열을 쓰지만 문자를 이용해서 로직을 짜야하는 경우도 있기 때문에 문자와 문자열을 완벽하게 분리하여 이해해야 함
  • 문자형 = 기본형 / 문자열 = 참조형
  • 선언 관점에서 차이점
    • 문자(char) → 문자 하나를 저장 ex) ‘a’
    • 문자열(String) → 문자열을 저장 ex) “apple”
  • 저장 관점에서 차이점
    • 문자(char) : 문자 뒤 \0(널문자)가 없다. (1byte 사용)
    • 문자열(String) : 문자 뒤 \0(널문자) 포함 → 문자가 붙은 형태, 어디서 끝날지 모르기 때문에 널문자를 넣어줌으로 끝을 알려줘야 함

참조형

  • 주소형 변수
  • 원본값이 필요한 이유는 크기가 크기 때문에 별도의 저장 공간이 필요하다
  • 메모리 영역 → Stack 영역 / Heap 영역
    • 기본적으로 기본형 변수와 참조형 변수 주소값을 저장하는 부분은 Stack 영역(정적)
      • int(4byte), char(1byte) 등 정적으로 할당된 메모리 영역
    • 참조형 변수의 원본값을 저장하는 부분은 Heap 영역(동적)
      • 동적 = 알 수 없을 때

입력 & 출력

  • 입력
    • Scanner.in 객체의 next( ) 명령을 사용해서 입력
    • Java는 기본적으로 Scanner에 in 객체가 있음
    • 객체는 항상 행동이 있다
    • next 메소드/명령을 이용해서 키보드에 입력된 값을 입력 받음
  • 출력
    • System.out 객체의 println( ) 명령을 사용해서 출력
    • sout = System.out

10진수, 2진수, 16진수

  • 2진수(0~1)를 10진수, 16진수로 변환된 값 예시 표

  • 10진수를 2진수로 계산하는 법

  • 숫자 변수는 편하지만 문자형은 16진수가 개입되면서 헷갈릴 수 있음

  • char의 문자형 저장 방식

    • char a : ‘A’ 라고 했을 때 1byte 사용
    • 아스키 코드 : ‘A’ = 65, 65를 2로 나누면 100001 여덟 자리 채우기 위해 앞에 0을 붙이고 뒤에는 2진수인 것을 의미하는 (2) 붙이기
    • 여덟 개의 BIT를 차지하는 이 방법으로 16진수 표현하기
      • 100 = 4 / 1 = 1

1-9 형 변환

  • 변수의 타입을 바꾸는 방법
    • 문자열 → 숫자
    • 정수 → 실수
    • 실수 → 정수

명시적 형 변환

double형 or float형(실수) → int(정수) 변환

  • double, float : 실수형(0.xxx) → int 정수형(0)

    • 실수의 타입과 변수의 값 정해주기
  • double → int 변환

    • 정수의 타입과 변수 지정
      → int intNumber;

    • 변수를 불러 더블넘버(더블의 변수)를 인트로 변환
      → intNumber = (int)doubleNumber);

    • sout으로 전과 후 출력해 보기
      → 전 : System.out.println(doubleNumber); = 10.10101
      → 후 : System.out.println(intNumber); = 10

    • 더 보기 편한 형태(앞에 문자열 주기)

  • float형 → int 변환

    • double형 → int 변환과 같음

int(정수) → double형 or float형(실수) 변환

  • int 정수형(0) → double, float : 실수형(0.xxx)
    • 타입과 변수의 값 정해주기
      → int intnumber = 10;
  • int → double 변환
    • 변수를 불러 intNumber(int의 변수)를 double로 변환
      → double doubleNumber = (double)intNumber);
  • int → float 변환
    • 변수를 불러 intNumber(int의 변수)를 float로 변환
      → float floatNumber = (float)intNumber);
  • int, int → double 변환, int → float 변환 출력
    • 원본 intNumber가 실수형으로 변환 되면서 소수점이 생긴 것을 확인 할 수 있음

암시적 형 변환

  • Java 안에서 자동으로 형을 바꿔주는 케이스 또는 타입 또는 형태
  • 변수 타입의 크기 순서
    • byte(1byte) 정수형
    • short(2byte)
    • int(4byte)
    • long(8byte)
    • float(4byte)(부동소수점 때문에 더 큼)
    • double(8byte)
  • 순서대로 자동으로 형이 바뀌게 되는 모습이 나타남
  • (1) byte → int
    • 바꿀 변수 = (바꿀 타입)과 바꿔질 변수에서 ()중괄호가 생략돼도 됨

  • (2) char(1byte) → int(4byte)
    • char은 1, int는 4기 때문에 char → int로 자동 형변환

    • byte → int는 위에 있고 char → int는 변수로 새로(밑) 코드를 짰기 때문에 결과 값이 새롭게 가능

    • 대문자 ‘A’가 가지고 있는 유니코드가 65 (아스키 코드 참고)

  • 좌측(큰 byte)에는 우측(작은 byte)에 할당하려고 하는 것 보다 더 큰 타입을 넣어줌
    = 자동으로 큰 타입에 귀속되도록 실행
  • (3) int → long number
  • (4) int → double
    • 실수형으로 자동으로 형 변환

    • double형은 가장 표현할 수 있는게 많은 변수타입

    • inNumber는 int 타입이기 때문에 크기가 더 큰 double 타입에 귀속 됨

연산의 예시

  • 작은 크기의 타입이 큰 크기의 타입과 ‘계산’될 때,
    자동으로 큰 크기의 타입으로 형 변환이 됩니다.
    (명시적, 암시적 형 변환은 ‘할당’만 함)
  • 더하기
    • int형 보다 double형이 더 크기 때문에 실수형으로 따라가야 함

  • 나누기
    • (1) 정수로 나누기
      • int iResult(변수) = intNumber(10) / 4;
        → 10 나누기 4
    • (2) 실수로 나누기
      • double dResult = intNumber(10) / 4.0;
        → 10 나누기 4.0
    • 결과
      • (1) int 정수로 나눈 결과는 소수점을 미포함 = 2

      • (2) double 실수로 나눈 결과는 소수점 포함 = 2.5

자동 형변환 vs 강제 형변환

  • 자동 형변환
    • 작은 타입에서 큰 타입으로 형 변환 할 때는 더 큰 타입으로 자동으로 변환
  • 강제 형변환
    • 자동 형변환과 반대되는 개념
    • 강제적이기 때문에 값에 손실이 생김
profile
공부하자개발하자으쌰으쌰

0개의 댓글