본문 바로가기

JAVA 기본

자바 2주차 스터디 [ 백기선 강사님 ]

 

1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값

  • 프리미티브 타입 종류
    * 1 bit 당 표현 가능 숫자 : 2^1 [ 비트수에서 Signed 값이 되어있는 경우 최상위 비트 1개는 부호를 나타낸다 ]
    => 따라서 -2^(bit-1) ~ {2^(bit-1) -1} // 0이 포함되기 때문에

    -  byte [ 1 byte / 8 bit ] =>  2^8 표현가능 = -128~127 까지 표현가능 
    Signed type

    - short  [ 2 byte / 16 bit ]  => 2^16 표현 가능 = -32768 ~ 32,767 

    - int [ 4 byte / 32 bit ] => 2^32 표현 가능 = -2^31 ~ (2^31)-1
    int 는 signed type 이나, 자바 8 버전 이상부터는 unsigned type으로도 사용이 가능하다. 즉, 0~2^32-1 까지 사용이 가능하다.

    - long [ 8byte / 64 bit ] => 2^64 표현 가능 = -(2^63) ~ (2^63)-1
    java 8 이후부터는 unsigned Long 처럼 사용도 가능하다.

    - float [ 4byte / 32 bit ] => IEEE 754 floating point 를 제공한다.
     * [ 차후 IEEE 754 에 대해 조사할 것 ] 
    - double [ 8byte / 32 bit ] => IEEE 754 floating point 를 제공한다.

    * float / double 의 부동소수점의 경우, 계산식에서 정확성이 떨어질 수 있기 때문에, Decimal이라는 클래스를 이용하여 정교한 계산을 한다. [ 부동소수점의 문제로 인한 JAVA의 계산을 위한 클래스 ]
     

    - boolean : true & false 값을 갖는 값.
  • 기본 값

** 부동소수점(floating point) 방식은 이진수로 미처 표현하지 못한 실수를 컴퓨터상에서 근사치의 값으로 표현할 때 정수 소수로 나누어 소수점의 위치를 고정하지 않고, 그 소수점의 위치를 나타내는 지수 부분(exponent) 유효숫자를 나타내는 가수 부분(fraction/mantissa)으로 나누어 표현한다.

 

 

2. 프리미티브 타입과 레퍼런스 타입

  • 프리미티브 타입 : 스택에 저장되는 객체
  • 레퍼런스 타입 : 힙 영역에 저장되는 객체

    프리미티브 타입은 스택에 저장되며, 객체를 넘길때, 값이 복사된다.

    일반적으로 레퍼런스 타입은 클래스로 정의 된다.

    힙 영역에 저장되지 않는 Object : String  

    그럼 과연 레퍼런스 타입은 주소를 가지고 있는 것일까?
  • 특이점... 이건 .... 뭐야?

    어떤 변수를 선언한다.


package com.company;

public class Main {

    public static void main(String[] args) {
        POP p = new POP();
        System.out.println(p);
        System.out.println(t(p));
        System.out.println(p);
    }
    public static POP t(POP p){
        p = new POP();
        return p;
    }
}

class POP{


}

위와 같은 소스가 있다고 가정하자,

여기서 POP 는 일반적인 클래스이며, 해당 부분은 레퍼런스 타입으로 param 안에있는 멤버 변수, 메소드에 접근이 가능하다.

 

그렇다면, 여기서 param은 연결된 주소를 갖는다 맞는가?

그럼 저 p 에 새로운 객체 new POP를 하게 되면 주소를 변경하여준다.

그 후 출력해본다.

그럼 밖에있는 p 값은 변경이 되어야한다. 즉 진정한 연결 전달 방식이라면 변경 되어야 한다.

 

그래서 나온 결과값이다.

이상하다. 변수를 메소드 내부에서 변경하였는데. 해당 부분이 변경되지 않았다.

 

해당 부분은 차후 공부하여 정리한다.

 

3. 리터럴

리터럴(literal)이란 소스 코드의 고정된 값을 대표하는 용어

거의 모든 프로그래밍 언어는 정수, 부동소수점 숫자, 문자열, 불린 자료형과 같은 용어를 가지고 있다. 어떤 언어는 열거 타입이나, 배열, 자료형, 객체와 같은 용어도 있다. 리터럴과 대조적으로, 고정된 값을 가질 수 있는 변수나 변경되지 않는 상수가 있다. 다음의 예제와 같이, 리터럴은 변수 초기화에 종종 사용된다.

 

불리언 자료형 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨터 과학에서 불리언(boolean) 자료형은 논리 자료형이라고도 하며, 참과 거짓을 나타내는 데 쓰인다. 주로 참은 1, 거짓은 0에 대응하나 언어마다 차이가 있다

ko.wikipedia.org

- 리터럴 
객체 내부의 값이 변경되어선 안된다.

  • int : 0,1,2..... 같은 숫자형
  • float : f 를 붙인 실수
  • long : 1l,2l,3l, ..., 5L,6L .,.. 
  • double : 실수인 경우 기본적으로 더블로 인식 [f를 안붙이면 float에 값이 들어가지 않음]
  • char 에서의 리터럴 : '' 안에 있는 한가지 문자 또는 유니코드 이스케이프로 되어있는 리터럴 [특이]
  • String에서의 리터럴 : 더블 쿼터 안에 들어가 있는 값, 불변 객체 [ read only ]
  • Java에서의  Enum 의 값은 항시 리터럴 값이다. [ ....? Enum의 경우 Runtime시에 변경이 불가 ] 

특이한 char 리터럴

4. 변수 선언 및 초기화하는 방법

* 변수의 선언 및 초기화
  
  변수는 선언, 생성, 사용으로 이루어 진다.
  변수의 선언은 상단에 이루어지며, 동시에 생성이 이루어지기도 한다.
  => 타입명  변수명 [ = 값 / 생성자 ] ; 

  변수의 사용은 해당 변수를 수정 / 사용 하는 것으로, 변수명을 이용하여 이루어진다. 

 

5. 변수의 스코프와 라이프 타임

  변수의 스코프 

  Static 스코프
   - Static으로 선언 되어있다면 그 스코프는 메모리상에 올라간다.

      JVM Class Variable에 저장

      어플리케이션이 종료될때까지 살아있다.
  인스턴스 스코프
   - 인스턴스를 생성하게 되면 그 내부에서 돌아가는 스코프 즉, 그 인스턴스 안에 있는 메소드 안에서는 사용이 가능하다.
   - 인스턴스 내부 static 메소드의 경우 static 변수만 사용이 가능하다.
  블럭 스코프
   - 중괄호로 되어있는 부분에 변수를 선언하면 그 이후에는 사용이 불가능하다.

   - 즉 생성주기가 선언되었을때, 이후 블럭이 끝나면 사라진다.
  메소드 스코프 
   - 메소드 내부에서 사용된다. 메소드 내부에서 변수를 선언 및 처리한다.

6. 타입 변환, 캐스팅 그리고 타입 프로모션

  변수를 다른 크기의 변수로 변환하는 것을 타입변환이라고 한다.

  이때 변수를 더 작은 크기의 클래스로 변경하는것을 캐스팅, 그리고 더 큰 크기의 클래스로 변경하는 것을 타입 프로모션이라고 한다.

  

  강제 형변환을 이용한 캐스팅: 

    - 작은 크기의 변수로 자신의 값을 넣는 캐스팅 변수 앞 ( 변환 타입 ) 으로 정의한다.

 

double a = 10.01;
int b= (int) a;

 와 같이 사용이 가능하다.

 위와 같이 사용하는경우, 소수점은 제외한 10만 가져온다. 

 int 데이터가 표현할 수 없는 숫자 값이 a 에 담겨 있었다면, 값이 이상하게 변경된다 [ 정확성이 ... ]

 

 그렇다면 String 을 int 에 넣으려고 할 때 어떻게 될까?

 

 일반적으로 캐스팅은 안되나, Integer, Double, 등등 primitive를 감싸는 Wrapper 클래스를 이용한다면 캐스팅이 가능하다.

이런식으로 캐스팅을 했을 때, b를 통해 이용이 가능하다.
이때, 캐스팅이 안되는 상황일때 발생하는 Exception은 IlligalArgumentException을 상속받은 NumberFormatException으로, 메소드에 숫자가 아닌 문자가 들어가거나, 범위를 벗어난다면 발생한다.

 

 타입 프로모션 : 자동 형 변환 처리

 상위 타입으로 넣는 경우 바이트를 늘려 자동으로 처리해 준다. 따라서 강제 형 변환을 하지 않아도 된다.

 

 [ 물음! ] 객체지향의 경우 Class 는 상속이 가능하다. 그렇다면, Class 를 상속받은 객체는 상위 객체에 담을 수 있다.
 Class를 상속한 부모 클래스의 경우 하위 클래스로 캐스팅 할때, 강제 캐스팅 방식을 한다. 이때, 부모 클래스는 힙영역에 할당되는 곳이 다를 것인데, 해당 부분 처리는 어떻게 되는가?

 

** 위와 같은 상황에서 자식은 부모에 강제 형 변환으로 넣을 수 있다. 데이터의 손실이 있는가? 여기서는 부모 클래스가 더 객체의 크기가 작으나, 자식 클래스는 부모클래스에 바로 담을 수 있다. 

부모 클래스는 자식 클래스로 변경하는데 있어서 타입 캐스팅을 해야 한다. 

 

 이 부분은 Polymorphism [ 다형성 ]  으로 불리는데 타입 캐스팅하는 과정에서 확인해 봐야 할 것 같다.

 

 

7. 1차 및 2차 배열 선언하기

   1차원 배열 선언 : [ type ] [] 변수명 ;  or [type] 변수명[] ; 으로 선언

   2차원 배열 선언 : [type] [][] 변수명; or [type] 변수명[][]; 으로 선언

   1차원 배열 생성 : 변수명 = new type명[숫자];

   2차원 배열 생성 : 변수명 = new type명[숫자][숫자];

 

   배열에서 가리키는 방식

 

8. 타입 추론, var



출처
- https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

 

Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

'JAVA 기본' 카테고리의 다른 글

[백기선 강사님] 3주차 과제  (0) 2021.02.18