온라인 자바 스터디 2주차

wannte·2021년 1월 5일
0
post-thumbnail

목표

자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

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

- Integer

  • byte

    Size = 8 bit

    Precision = -2^7 ~ +2^7-1

    byte 데이터 타입은 메모리 절약이 중요한 큰 어레이의 메모리 저장에 사용된다.

  • char

    Size = 16 bit (2 byte)

    Precision = 0 ~ 2^16-1

    All Unicode characters

  • short

    Size = 16 bit (2 byte)

    Precision = -2^15 ~ 2^15-1

  • int

    Size = 32 bit (4 byte)

    Precision = -2^31 ~ 2^31-1

  • long

    Size = 64 bit (8 byte)

    Precision = -2^63 ~ 2^63-1

- Floating-point

  • float

    Size = 32 bit (4 byte)

    1 bit : 부호 부분, 8 bit : 지수 부분, 23 bit 가수 부분

    Precision : 3.402,823,5 E+38 to 1.4 E-45

  • double

    Size = 64 bit (8 byte)

    1 bit : 부호 부분, 11 bit : 지수 부분, 52 bit 가수 부분

    Precision : 1.797,693,134,862,315,7 E+308 to 4.9 E-324

- Other

  • boolean

    Size = 1 bit

    true or false


출처 : https://doublesprogramming.tistory.com/73

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

Process를 진행하는데 있어서, Stack Memory에 어떠한 값을 저장하냐에 따른 차이이다.

프리미티브 타입의 경우 그 값 자체를 저장하고, 레퍼런스 타입의 경우, 그 객체의 주소값을 저장한다.

리터럴

literal의 사전적 정의는 '정확한'의 뜻이며, 컴퓨터 과학 분야에서는 소스 코드의 고정된 값을 대표하는 용어이다.

정수 리터럴

10진수, 2진수, 8진수, 16진수

int a = 15;
int b = 0b0101; -> 5
int c = 015; -> 13
int d = 0x15; -> 21

2진수에 경우 0b, 8진수 0, 16진수는 0x가 앞에 붙는다.(이때 영어 O가 아닌 숫자 0이다)
(영어의 대소문자는 상관없다)
앞에 0을 붙이게 된 경우, 10진법이 아닌 8진법으로 게산되는 것을 주의하자.
cf. Integer.parseInt("015")의 경우 15의 값을 같는다.
정수 리터럴은 int형으로 컴파일

long type의 경우에만, 끝에 L or l

실수 리터럴

실수 타입 리터럴은 double 타입으로 컴파일

double f = 0.1234;
double g = 1234E-4;
E를 사용하여 나타낼 수도 있다.

숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 한다. float은 f를 꼭 붙여줘야하고, double은 생략가능.

문자 리터럴

단일 인용부호('')로 문자를 표현
유니코드 값을 직접 넣어줄 수도 있음.('\uae00')
char c = 'uae00';

다음의 특수 문자 리터럴도 존재한다.
'\b'(백스페이스), '\t'(탭), '\n'(라인피드)', '\f'(폼피드),
'\r'(캐리지 리턴), '"'(이중 인용부호), '''(단일 인용부호), '\'(백슬래시)

cf. 캐리지 리턴 vs 라인 피드
캐리지 리턴은 커서의 위치를 현재 줄의 맨 처음으로 보내는 기능을 하고, 라인피드는 커서를 다음 줄로 옮기는 기능을 한다.
윈도우즈와 유닉스는 전통적으로 아스키 파일에 대한 처리가 다른데,
유닉스는 LF만으로 개행을 표현하고 윈도우즈는 CR/LF의 조합으로 개행을 표현한다.

form feed는 프린트 출력시 이번페이지를 마치고 다음 페이지로 넘기기 위해서 사용.(page breaking ASCII코드)

문자열 리터럴

문자열은 프리미티브 타입이 아니지만, "" 로 문자열을 표기
String string = "JAVA";

논리 타입

true, false. 조건문으로 표시
boolean a = true;
boolean b = 10 > 0;

cf. c와는 달리 1,0을 boolean타입으로 사용불가

null 리터럴

레퍼런스 타입에 경우에만 사용가능.(default값이 null)
String str = null;

cf. Is null an instance of anything? -> Nope

RelationalExpression: RelationalExpression instanceof ReferenceType

At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast to the ReferenceType without raising a ClassCastException. Otherwise the result is false.

그렇기 때문에, any type E and R, for any E o, where o == null, o instanceof R is always false.

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

변수 선언

//각각 선언
int a;
int b;
int c;

//콤마를 이용하여 동시에 선언
int a,b,c;

//값의 대입을 함께 할 수도!
int a = 1, b = 2, c = 3;

변수 초기화

변수의 처음으로 값을 저장하는 것이 변수 초기화 이다. 가능한 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직.
멤버 변수는 초기화를 하지 않아도 기본값으로 초기화가 이루어지지만, 지역변수는 사용하기 전에 반드시 초기화를 이루어 져야한다.

class Test {
  int x; // 멤버 변수
  int y = x; // y = 0
  
  void method() {
    int i; // 지역변수
    int j = i; // java: variable i might not have been initialized
  }
}

멤버변수를 초기화하는 방법은 다음과 같다.

  • 명시적 초기화 (explicit initialization)
  • 생성자 (constructor)
  • 초기화 블럭 (initialization block)
    • 인스턴스 초기화 블럭
    • 클래스 초기화 블럭
class Car {
// 명시적 초기화 : 변수 선언과 동시에 초기화	
  int door = 4; // 기본형 변수 초기화
  Engine engine = new Engine(); // 참조형 변수의 초기화
  int tire;
  static int classVar;
  int instanceVar;
  
// 생성자
  Car (int tireNumber) {
    tire = tireNumber;
  }

// 클래스 초기화 블럭 (static initialization blocks: 개인적으로 영어 표현이 맘에 든다)
초기화의 측면만 보았을 때는, 명시적 초기화와 다른점을 모르겠다. 장점이라면, 간단히 표기되지 아니하는 초기화나, 함수의 실행을 할 수 있다.(print)
  static {
    classVar = 10;
  }
  
// 인스턴스 초기화 블럭 : 중괄호 만을 이용. 생성자의 역할과 다를게 없어서 자주 사용되지는 않음. 단, 여러개의 생성자가 존재할 때, 코드의 중복을 줄이기 위하여 사용
  {
    instanceVar = 10;
  }

멤버 변수의 초기화 시기와 순서

클래스 변수 (static)

  • 초기화 시점 : 클래스가 메모리에 처음 로딩될 때 한번
  • 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭

인스턴스 변수

  • 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화
  • 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

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

변수의 스코프 : 변수에 접근하거나 접근할 수 있는 유효 범위/영역
변수의 라이프타임 : 변수가 메모리에서 살아있는 기간

인스턴스 변수

scope: 정적 메서드를 제외한 클래스 전체
lifetime : 객체가 메모리에 남아있을 때까지

클래스(static) 변수

scope: 클래스 전체
lifetime : 프로그램이 끝날 때까지 or 클래스가 메모리에 로딩 되어 있는 동안

지역 변수

scope: 선언된 블록 내
lifetime : 컨트롤이 선언 된 블록이 끝날때까지

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

타입 변한(Type Casting)

프리미티브 타입

  • 프로모션 (묵시적 형변환) : 작은 데이터 타입에서 큰 데이터 타입으로 형 변환(자동 형변환)

  • 캐스팅 (명시적 형변환) : 큰 데이터 타입에서 작은 데이터 타읍으로 형 변환(강제적으로 앞에 casting해줘야, 그렇지 않으면 에러 발생)

int x = 10;
byte y = (byte) x;

클래스 타입

기본적으로 타입캐스팅이 불가능하지만, 상속 관계인 경우 가능하다.

  • Up-Casting : 부모 클래스는 명시적인 타입캐스팅 없이 자식과 연결 할 수 있다.
  • Down-Casting : 자식클래스는 명시적인 타입캐스팅이 있다면 부모와 연결할 수 있다.
Shape r = new Rectangle(0,0,10,20); // 암묵적으로 Shape r = (Shape) new Rec~ 실행
Shape c = new Circle(0,0,9,9);

Circle c = (Circle)new Shape(0,0,9,9); // 명시적으로 캐스팅해주었을때 컴파일 가능. 실행해보면 에러 발생

Shape sc = new Circle(0,0,9,9);
Circle c = (Circle)sc;
Sytem.out.println(c.getArea()); // 원래 Circle이였던 경우에는 제대로 실행된다.

1차 및 2차 배열 선언하기

int[] 1dArray = new int[10];
int[][] 2dArray = new int[10][10];

타입 추론, var

타입 추론: 코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것.
var : 자바 10부터 제공, local variable이면서 선언과 동시에 initializer가 필수적으로 요구됨.

var message = "컴파일러는 오른쪽에 초기화 값으로 제공되는 것을 통해 타입을 유추한다"

출처:자바-변수의 초기화

profile
The Process

0개의 댓글