본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JAVA

JAVA 스터디 2-자바 데이터 타입 , 변수 그리고 배열

반응형

목표

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

학습할 것

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값v
  • 프리미티브 타입과 레퍼런스 타입v
  • 리터럴v
  • 변수 선언 및 초기화하는 방법v
  • 변수의 스코프와 라이프타임 v
  • 타입 변환, 캐스팅 그리고 타입 프로모션v
  • 1차 및 2차 배열 선언하기v
  • 타입 추론, var

 데이터 타입을 기준으로 프로그래밍 언어를 나누면

1.c, c++ , Java와 같이 정적 데이터 타입을 사용하는 언어와 

2.Ruby, Python과 같이 동적 데이터타입을 사용하는 언어가 있다.

 

1번 언어는 컴파일 타임에 각 변수와 표현식 유형이 알려지고 변수가 특정 데이터 유형으로 선언되면 다른 데이터 유형의 값을 가질수 없다 .

2번 언어는 컴파일 후에도 다양한 데이터 유형을 가질 수 있다. 

 

 자바는 1번에 해당해며 각각의 데이터타입은 이미 프로그래밍 언어의 부분으로 정의되 있고 사용되는 모든 상수 또는 변수는 데이터 유형 중 하나로 정의 되어야한다.

 

 

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

*자바는 바이트단위로 표현하기 때문에 boolean은 1 바이트로 취급된다.

타입 기본값 크기 값의 범위
boolean(논리형) false 1 bit (1byte) true , false
byte(정수형) 0 8 bits (1byte) -128 ~ 127
char(문자형) \u0000 16 bits (2byte) '\u0000' (0) to '\uffff' (65535)
short(정수형) 0 16 bits (2byte) -32768 ~ 32767
int(정수형) 0 32 bits (4byte) -2147483648 ~ 2147483647
long(정수형) 0 64 bits (8byte) -9223372036854775808 ~ 9223372036854775807
float(실수형) 0.0 32 bits (4byte) ±3.40282347E+38, ±1.40239846E-45,
IEEE 754-1985표준
double(실수형) 0.0 64 bits (8byte) -1.79769313486231570E308~
+1.79769313486231570E308


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

Primitive Data Type(원시 데이터 타입)

 

-boolean, char, int ,short, byte, long, float, double이 있다

-실제 값이 변수(stack 영역)에 저장된다.

  ex ) int a = 10; 

  10이라는 값이 변수에 바로 담기고 stack 영역에 저장된다 .

-자바에서 기본 자료형은 반드시 사용하기 전에 선언(Declared) 되어야 한다.

-OS에 따라 자료형의 길이가 변하지 않는다.

-객체 타입이 아니기 때문에 null 값을 가질 수 없다

 ex) int a = null ;  <- 불가능

 

 

Reference Data Type(참조형 데이터 타입)

 

-기본형을 제외한 모든자료형은 Reference Type이다 (class타입,interface 타입 , array 타입 , enum타입 ).

-실제 값이 아닌 인스턴스의 주소값이 변수(stack 영역)에 저장되고  실제 생성된 값은 (heap 영역에 저장된다.)

-참조 타입의 데이터의 크기가 가변적, 동적이기 때문에 동적으로 관리되는 Heap 영역에 저장이 된다.

클래스 타입,인터페이스 타입 , 배열 타입 , 열거 타입 

ex) String a = new String ("abc");

a는 스택영역에 "abc"를 가리키는 주소값과 함께 저장되고 실제 String 타입의 "abc"는 (heap 영역에 저장된다 )

   

 

3. 리터럴(literal) 이란?

프로그램에서 직접 표현한 값 , 소스 코드의 고정된 값을 대표하는 용어

종류로는 정수, 실수, 문자, 논리, 문자열 리터럴이 있다.

 

정수형 리터럴

 

- 자바에서는 정수형 숫자들은 모두 int 형으로 인식한다 (CPU의 데이터 처리단위가 int이기 때문에). 예를들어 아래와 같이 int형의 최대 범위인 2147483647보다 1많은  숫자를 long 타입객체에 담으면  컴파일시 오류가 발생한다.

ex) long number  = 2147483648 ; <-오류뜸

따라서 담긴 숫자가 long 타입인걸 알려주는 'L'(대문자)또는 'l'(소문자)을 붙혀줘야 컴파일러가 알아듣는다.

ex) long number  = 2147483648L;

 

-byte형과 short형 정수의 표현 방법을 제공하지 않기 때문에 byte형과 short 형은 아래와 같이 int형으로 초기화 할 수있다. 

ex ) byte num =1;
      byte num1=2;
      num+num1의 값은 3이지만 인터형으로 초기화 되었기 때문에 메모리에 차지하는 공간은 int형의 크기인
      4byte가 되기 때문에(자동 형변환)
      byte sum = num + num1; <-여기서 byte 변수에 담길수 없다.   
      이런 문제를 해결하기 위해  아래처럼 자동 형변환된 데이터를 강제로 형변환 시킬 수 있다. 
      byte sum =(byte)(num+num1);

      

-int 형 정수를 2진수 , 8진수 ,16진수로 표현할 수 있다 . 숫자 앞에 2진수'0B' 또는 '0b', 8진수'0', 16진수'0x' 또는 '0X'를 붙여서 표현할 수 있다 .

ex) int num = 0B11; 2진수 11 ->10진수의 3
     int num = 011;  8진수 11   ->10진수의 9 
     int num = 0x11; 16진수 11 -> 10진수의 17

-단위가 큰 수의 표현 및 익식에 도움을 주기위해서 숫자 중간에 언더바를 넣을 수 있다 .

 ex) int num =999_999_999 ;  <- 999999999를 의미

 

실수형 리터럴

- 자바에서 실수형 숫자들은 모두 double형으로 인식한다. 따라서 , float 형으로 표현하고 싶다면 숫자 'f'또는 'F'를 붙여서 표현해야한다. 

ex)  float num = 3.005F; 
      double num = 3.005; 
      float num = 3.005; <-오류남   

- 연산할 두 대상의 자료형이 다를 때는 연산의 결과는 두 자료형중 더 큰 자료형에 저장된다. 

ex) int a = 5 ; 
     float b = 10.4;
     float result = 15.4;

- float도 4byte고 int도 4byte인데 왜 결과가 float이 되었을까?

   표현할 수있는 범위의 키기가 float이 더크기 때문에 그렇다 . 

- 표현할 수 있는 범위의 크기 순서

      byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

 

문자 리터럴

단일 인용부호 ('')로 char(1글자) 타입의 문자를 표현한다.

char a= 'A';

char b='한';  

 

특수문자 리터럴

특수문자 리터럴 의미 특수문자 리터럴 의미
'\b'  back space '\r' carriage return
'\t' tab '\"' double quote
'\n' line feed(줄바꿈) '\'' single quote
'\f' form feed '\\' backslash

문자열 리터럴

 

("")로 문자열을 표현한다.

 

상대적으로 많이 사용되는 String 객체의 성능을 향상시키기 위해 자바에서는 스트링 리터럴로 변수를 선언할 경우 heap 영역에 String constant pool에 값이 저장되며 다른 객체에서 같은 스트링 값을 사용할때 String constant pool에 저장된 값이 재사용된다.  

 

String a = "안녕" ;
Stirng b = "안녕" ;     <- a와 b 는 String constant pool에 위치한 같은 값("안녕")을 참조하고 있다 .
만약 값을 변경하면 String constant pool 새로운 값을 저장한다. 
String b = "hi"; 
"hi" 라는 값이 새로 String constant pool에 저장 되었다.

논리 타입 리터럴

boolean 타입 변수에 치환하거나 조건문에 이용된다.

boolean a = true;
boolean b = 10 > 0;(여기선 b값이 true)
boolean c = 0;

null 리터럴

-참조형 데이터 타입에만 사용이 가능하다 . primivite 타입에는 사용 불가 ;

ex)int a = null;(에러)
  String str = null;
  str = "JAVA"

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

변수는 RAM에 데이터를 저장할 공간이다 . 값이 변경 될 수 있으며 하나의 값만 저장할 수 있다 .

 

변수명 생성 규칙

-영어 대소문자가 모두 구분된다  

  ex) int test ; int Test;

      -위의 두 변수는 서로 다른 변수로 간주된다.-변수명의 시작이 숫자로 시작되서는 안된다.

  ex) int 1test =0;  <-컴파일 에러가 발생한다.

-특수문자는 '_' 와 '$'만 사용 가능하다 

 ex)int _num ,int $num <-사용가능 
 int !num;  <-사용불가

-Java에서 내부적으로 사용하는 예약어는 사용할 수 없다.

 ex)int true; int if; int class , int extends 등등 ..<-사용불가

변수의 종류 

 

1.클래스 변수 / 정적변수 (Static 변수/ 해당 클래스를 통해 생성된 모든 인스턴스가 공유하게 된다 .)

 

  static을 키워드를 이용하여 선언한다. 한 클래스의 모든 인스턴스 들이 공통적인 값을 유지해야하는 경우에 클래스 변수로 선언하며 클래스가 로딩될때 메모리에 Method area에 생성된다 . 클래스 변수는 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수있다는 특징이 있으며 . inner 클래스에서는 선언할 수 없다 . new 하여 만들어진 객체를 통해서는 static 메서드를 참조할 수 없다 . 클래스이름.클래스 변수의 형태로 사용한다

 

2.인스턴스 변수(각각의 인스턴스에서 사용하는 변수)

 

 클래스 영역에서 선언되고 , 클래스의 인스턴스가 생성될때 만들어진다 . 인스턴스는 독립적인 저장공간을 가지므로 , 서로 다른 값을 가질 수 있다. 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 , 인스턴스 변수로 선언한다. 

 

3.지역변수( 메소드 내에서 선언되는 변수)

 

 메서드 내에서 선언되며 , 메서드 내에서만 사용이 가능. 메서드가 종료되면 소멸되어 사용할 수없게 된다.

 

4.매개변수 

 

  흔히 파라미터라고 불린다. 메소드에서 입력값을 받을 때가 있는데 그때 사용되는 변수를 매개변수라고 한다.

매개변수도 메소드 내에 선언된 것으로 간주되므로 지역변수이다. 인자값은 호출시 메소드입력부의 넣는 값이며 이값은 매개변수에 복사되어 대입된다.

 

변수의 선언 

 

 변수를 사용하기 전에 반드시 변수를 선언하고 초기화해야한다. 변수를

 

변수 초기화 

 

 선언한 변수에 최초로 값을 할당 하는 것을 뜻한다. 멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초괴화하지 않고 사용해도 되지만 지역 변수는 사용하기 전에 반드시 초기화를 해야한다.

ex) class Test{
  int x;
  int y=x;   // 클래스내의 멤버변수이기 때문에 컴파일 에러가 발생하지 않는다 .

 void method(){  
   int i; 
   int j = x // 메서드 내의 지역변수임으로 컴파일 에러 발생한다 
   }
}

 

변수 초기화 방법

 

1. 명시적 초기화 (explicit initialization)

 

   -변수를 선언과 동시에 초기화 하는 것을 명시적 초기화라 한다. 가장 기본적이고 간단한 초기화 방법이며 , 여러 초기화 방법 중 가장 우선적으로 고려되어야 한다 .

 간단하고 명료하긴 하지만 보다 복잡한 초기화 작업이 필요할 때는 '초기화 블럭' 또는 생성자를 사용해야한다. 

ex) class Car{
      int door =4; 
      Engine e = new Engine(); 
    }

      

2. 생성자 ( constructor)

3. 초기화 블럭(initialization block)

 

   -인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용

  초기화 블럭을 작성하려면 인스턴스 초기화 블럭은 단순히 클래스 내에 블럭{ }을 만들고 그 안에 코드를 작성하기만 하면 된다. 그리고 클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 static 만 붙혀주만 된다.

 초기화 블럭 내에는 메소드 내에서와 같이 조건문 ,반복문 ,예외처리구문 등을 자유롭게 사용할 수 있으므로 최기화 작업이 복잡하여 명시적 초기화만으로 부족한 경우 초기화 블럭을 사용한다.

 

class InitBlock{
  static {클래스 초기화 블럭 코드}
 {인스턴스 초기화 블럭 코드} 
}

- 클래스 초기화 블럭  : 클래스 변수를 초기화 하는데 사용

  클래스 초기화 블럭은 클래스가 메모리에 처음 로딩 될때 한번만 수행되며 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때마다 수행된다. 생성자 보다 인스턴스 초기화 블럭이 먼저 수행된다 . 인스턴스 변수의 초기화는 주로 생성자를 사용하기 떄문에 인스턴스 초기화 블럭은 잘 사용되지않는다 . 대신 클래스의 모든 생성자에서 공통적으로 수행되어야 하는 코드가 있는 경우 생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어두면 코드의 중복을 줄일 수 있다.

 예를들어 클래스의 모든 생성자에 콩통적으로 수행되어야 하는 문장들이 있을때 , 이 문장들을 각 생성자마다 써주기 보다 아래와 같이 인스턴스 블럭을 이용하면 코드가 보다 간결하고 유지보수하기 쉬워진다.

 

클래스 초기화 예시 

위의 코드에는 Test1 이란 클래스에 클래스 초기화 블럭 , 인스턴스 초기화 블럭 , 생성자가 존재한다 .

메인메서드를 통해 실행하게 되면 아래와 같은 결과가 나온다.

 

결과 

class initialize block
first block test
instance initialize block
constructor

 

결과를 보면 알 수 있듯 초기화 블럭은 처음 메모리에 로딩 되는 시점에 실행된다. 이러한 초기화 블럭은 배열이나 예외처리가 필요한 초기화에 사용된다 

 

클래스 초기화 블럭을 이용한 배열 초기화

클래스가 메모리에 로딩될때  arr 배열이 생기고 클래스 초기화 블럭이 실행되면서 배열의 값이 할당 된다 .

메인 메서드가 실행되어 배열을 값을 하나하나 출력해보면 랜덤한 값이 배열의 각 방에 들어가 있다.

 

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

 

클래스 변수의 초기화 시점 - 클래스가 처음 로딩 될때 단 한번 초기화됨

인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이루어 진다 .

 

클래스 변수의 초기화 순서 : 기본값 - > 명시적 초기화 -> 클래스 초기화블럭

인스턴스변수의 초기화 순서 : 기본값 - > 명시적 초기화 -> 인스턴스 초기화 블럭 ->생성자 

 

프로그램 실행 도중 클래스에 대한 정보가 요구되어 질 때 클래스는 메모리에 로딩된다. 예를 들어 클래스 멤버를 사용 했을 때나 인스턴스를 생성할 때 등이 이에 해당한다 .

하지만 해당 클래스가 이미 메로리에 로딩되어 있다면 , 또다시 로딩하지 않는다 . 물론 초기화도 다시 수행되지 않는다.

 

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

변수의 스코프

-변수에 접근하거나 접근할 수있는 유효범위/영역을 말한다.

-일반적인 규칙은 변수가 선언된 블럭( { } ) 내에서만 접근이 가능하다는 것이다 .

 

변수의 라이프타임

-변수가 메모리에서 살아있는 기간을 말한다.

 

자바에서 각 변수별 스코프와 라이프 타임

 

1.지역변수

 

  지역변수는 메서드 내부에 선언하며 메서드 밖에서 사용이 불가하다 . 하나의 지역에 선언한 지역 변수는 그 지역을 벗어나면 사용할 수 없다 . 함수를 호출하면 메모리의 스택영역에 생성된다 . 함수가 종료하면 메서드 스택이 사라지고 그안에 있던 변수들은 사라진다 .

 각 메서드마다 스택이 생성되기 때문에  하나의 지역과 다른 지역의 변수 이름이 같아도 각각 다른 변수로 인식한다 . 

함수가 호출되서 실행을 마치고 값을 return하면 그 지역의 메모리는 해제된다 , 함수의 수행이 끝나 후에 지역 변수는 사용할 수 없다 .

 

 

 위 코드의 결과는 아래와 같다 

10

15

20

25

 

f1() , f2()안의 지역변수 a의 경우 해당 메서드가 끝나면 JVM 스텍에서 해당 스텍이 pop 되기 때문에 그 메서드안에 지역변수인 a도 함께 소멸된다 . 마찬가지로 main 메서드의 a 도 main 메서드가 끝나면 함께 소멸된다 . 

  변수 명이 모두 같지만 각 변수의 스코프에 맞는 값들이 출력된다 .

 

 

  

2.멤버 변수 (인스턴스 변수)

 

 멤버 변수는 new 키워드로 인스턴스를 생성해야 사용할 수있다. Heap에 객체안에 생성되며 멤버 변수는 해당 클래스의 메서드에서 사용이 가능하다 .  힙 메모리에 생성된 인스턴스는 자바의 GC(Garbage Collector)에 의해 적절한 시점에 수거된다. 

 멤버 변수를 private로 하면 다른 클래스에서 접근이 제한된다. 다른 클래스에서 private 멤버 변수를 사용하려면 getter setter 같은 클래스의 메서드를 통하는 방식으로 사용해야 데이터의 보안성이 좋아진다 .

 

3.static 변수(클래스 변수)

 

 static 변수는 프로그램 실행시 클래스를 메모리에 로드했을 대 부터 생성된다 . 인스턴스를 new 로 생성하지 않아도 사용할 수 있다. 메모리에는 스택, 힙 그리고 메타데이터 영역(Java 7이전 permGen)이 있는데 static은 데이터 영역에 생성된다 . 미리 생성되있기에 속도는 빠르지만 프로그램이 종료될 때 까지 메모리에서 해제되지 않는다(GC의 관리를 받지않음). static 변수를 많이 쓰면 시스템의 메모리가 그만큼 줄어드니 주의할 필요가 있다. 

 static 변수는 단어의 뜻처럼 프로그램이 실행시부터 종료시까지 그대로 고정되어 있다. 그래서 static 변수를 정적 변수라 하며 , 그 클래스로 만들어진 인스턴스들이 모두 하나의 값을 공유한다. 

 

 

 

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

 

Java 데이터 타입

 

자동 형변환 (Promotion)

강제 형변환(Casting)  

 

타입변환(형변환)

 

- 자바의 연산은 int + int   동일한 데이터 타입에서 가능하다 . 하지만 ,  int + double을 하여도 값은 나온다 .

이는 자바에서 자동으로 타입변환을 시켜주기 때문이다. 형변환에는 자동 형변환(Promotion) 과 강제 형변환(cating)

두가지가 있으며 또 다른말로는 묵시적 타입변환(자동 형변환) , 명시적 타입변환(casting) 이라고도 한다.

 

자동 형변환(Promotion)

 

-  프로그램 실행 중 자동적으로 형변환이 일어나는 것을 말한다. 작은 메모리 크기의 데이터 타입을 큰 메모리 크기의 데이터 타입으로 변환한다. 

ex)byte a = 10; 정수 10을 byte 데이터 타입의 변수인 a에 저장했을때 

    int b = a ;    byre 데이터 타입의 변수 a를 int 데이터 타입의 변수 b에 저장하였다. 

 

위와같이 작은 메모리 크기의 데이터 타입을 큰 메모리 크기의 데이터 타입에 저장하면, 자동으로 형변환이 일어나는 데 이를 자동 형변환 (Promotion)이라 한다. 

 

자동 형변환 되는 순서는 아래와 같다 

byte가 가장 작으며 double이 가장 큰 순이다.

 

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

 

데이터 타입 옆의 숫자는 데이터의 크기인데 flaot 은 long 보다 데이터 크기가 작은데  더 상위에 위치하고 있다, 

이는 float이 데이터 크기는 더 작지만 표현할 수있는 범위가 더 넓기 떄문이라고 한다 . 

 

promotion 에 몇 가지 특수한 사항이 있다. 

 

1) 정수 값을 실수로 변활할때

int a = 100; 

double b = a; 

int 타입 a 를 double 타입 b에 대입하면서  int -> double 타입으로 promotion 이 일어난다. 

이때 b를 출력해보면 10.0으로 소수점이 붙어서 나온다. 

 

2)문자 값을 정수로 변환할 때 

char c = 'A';

int i = c ;

 

int 타입 i 에 char 타입 c 를 대입했다.  

i 를 출력하면 65가 나온다  'A'의  유니코드 값인 65가  i에 저장된 것이다.

 

3)정수 값을 문자 값으로 변환할 때

byte b = 65;

char c = b; 

이때는 컴파일 에러가 발생한다 char 타입은 바이트 타입보다 크기가 크지만 표현범위가 다르기 때문에

promotion이 불가능하다 char는 0~65535 byte는 -128~127

이런 경우 int타입으로 받으면 가능하다 int 범위  -2,147,483,648 ~ 2,147,483,647

 

강제 형변환(Casting)

 

 형변환을 개발자가 강제로 시키고 싶을때 사용한다 .

ex ) int i =1;      byte b = i ;  

이 경우에 컴파일 에러가 발생한다. 1이라는 값은 byte의 범위에 들어가지만 int 라는 데이터 타입은 그러지 못하기 때문이다 . 이럴 경우 Casting을 사용하여 강제로 형변환을 시킬수있다. 

 

ex) int i =1 ;     byte b = (byte)i

이렇게 할 경우 i은 강제로 byte 타입으로 강제형변환(casting) 되지만 바꾸려는 데이터 타입의 범위를 벗어나는 경우에 overflow(범위보다 더 큰 값을 넣을려 했을때 제일 작은 수로 돌아감) 혹은 underflow(최소범위보다 작은 값을 넣으려 했을때 제일 큰수로 돌아감)가 발생할 수 있다 . 

 

ex) int i = 128 ;
   byte b =(byte) i ;  

    

 

byte의 최대범위 는 127이므로 오버플로우가 발생하고 b를 출력하면 - 128이나온다. 

 

 ex) int i = -129;
  byte b = (byte) i ;

 

이 경우에 byte 최소범위 -128을 보다 작으므로 언더플로우가 발생하며  b에는 127이 저장된다.

 

형 변환 연산

사칙연산은 같은 타입의 피연산자 간에만 수행되기 떄문에 서로 다른 데이터 타입의 피연산자가 있을 경우 두피연산자중 더 큰 범위를 갖는 타입으로 자동 형변환된후 연산이 수행된다. 예를 들어 int 타입 과 double 타입을 덧셈한다면 int  타입의 변수는 자동형변환(Promotion)으로 double 타입이 되고 연산이 수행된고, 연산의 결과도 double 타입이 된다.

 

 

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

 

배열(array)

배열은 같은 타입의 변수들로 이루어진 유한 집합이다. 배열을 구성하는 각각의 값을 배열 요소 (element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 한다. 자바에서 인덱스는 언제나 0 부터 시작하며 0을 포함한 양의 정수만을 가질수 있다. 배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용할 수있는 가장 기본적인 자료 구조이다. 배열은 선언 되는 형식에 따르 1차원 배열 , 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있다 .

하지만 현실적으로 이해하기 쉬운 2차원 배열까지가 많이 사용된다.

 

1차원 배열

 

 문법 

   1. 타입 [] 배열이름 ;  String [] strArr ;

   2. 타입 배열이름 [] ;  String strArr [] ; 

 

타입은 배열 요소로 저장되는 변수의 타입을 명시한다. 

배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용된다 .

첫번째 방법이 주로 사용된다.

 

위와 같이 선언된 배열은 new 키워드를 사용해 실제로 heap메모리에 생성할 수 있다. 

 

strArr = new String [10] ; <-[] 안의 숫자는 배열의 길이를 말한다 .

String [] strArr = new String [] ;  <- 동시에 선언도 가능하다. 

 

자바에서는 배열도 모두 객체이므로 , 각각의 배열은 모두 자신만의 필드와 메소드를 가지고 있다 .

 

빈 값은 자동으로 해당 데이터타입에 맞는 값이 초기화된다.

int [] nums1 = new int [3];
nums1[0] = 1;
nums1[1] = 2;

 

nums1[3]을 출력하면 0이 출력된다. 

 

배열의 초기화

 

자바에서는 변수와 마찬가지로 배열도 선언과 동시에 초기화할 수 있다 .

1.int [] nums = {10,20,30};

2.int [] nums = new int[] {70,90,100}; <-자동으로 배열 길이가 정해진다. 

 

배열 선언을 먼저하고 값 할당을 나중에하는 경우에는 2번 방법만 가능하다 

int [] nums ;

nums = {10,20,30}; <- 불가능

nums = int [] {10,20,30} <- 가능 초기화 블럭과 할당하는 배열의 타입은 일치해야한다. 

 

다차원 배열

 

 다차원 배열은  2차원 이상의 배열을 의미한다  , 배열의 요소로 또 다른 배열을 가지는 배열을 의미한다. 

즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며,

3차원 배열은 배열 요소로 2차원 배열을 가지고 ,

4차원은 3차원 ............

 

2차원 배열

 

 2차원 배열은 배열의 요소로 1차원 배열을 가지는 배열이다 

자바에서는 2차원 배열을 나타내는 타입을 따로 제공하지는 않는다 . 

대신 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있다.

 

int[][] arr =new int [2][3]

2행 3열의 배열이 생긴다고 생각하면 된다.

 

2차원 배열도 1차원 배열처럼 선언과 동시에 초기화할 수 있다. 

ex)int[][] arr = {

{10,20,30},
 {40,50,60}

} ;

 

가변 배열

2차원 배열을 생성할 때 열의 길이를 명시하지 않음으로 , 행마다 다른 길이의 배열을 요소로 저장할 수 있다.

ex) int [][] arr = {
 {10,20},
 {30,40,50},
 {60,80}
}

7.타입 추론, var

타입추론 (Type Inference) 

 

java 10에서 var이라는 Local Valriable Type-infrerence가 추가 되었다 .

타입 추론이란 정적 타이핑을 지원하는 언어에서, 타입이 정해지지 않은 변수에 대해서

컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능이다 타입 추론이 가능하다는 얘기는 타입을 명시하지 않다고 된다는말이고 코드량이 줄고 , 가독성을 높일 수 있다. 

 기존의 자바에서는 일반변수에 대해서는 타입추론이 지원되지 않고 , generics와 lambda식에 대해서만 타입 추론을 지원하고 있었다 .

동적 타이핑을 지원하는 언어에서는 다음과 같이 변수에 대해 타입 추론을 지원한다.

 

static<T> T test(T a1 ,T a2){return a2;};
public static void main(String[] args){
     Serializable d = test("t",new ArrayList<String>());
}

 

위에 test 메서드의 타입 매개변수는 T이고 메소드의 매개변수 a1과 a2 모두 T이다 . 하지만 test를 호출할 때 철번째 인자로 String을 주었고 두 번째 인자로 ArrayList를 주었다. 이런 경우에 모든 인자와 어울리는 공통부모는 Serializable이다 String과 ArrayList 모두 Serializable을 구현하고 있기 때문이다 .

 

타입 추론과 var에 대해선 이정도로 하고 나중에 개념이 쌓였을때 다시 공부해야겠다 .

 

 

 

 

참조 kohen.tistory.com/37  

      sleepyeyes.tistory.com/28  

      wikidocs.net/204#_2  

      www.geeksforgeeks.org/data-types-in-java/ (자바 데이터 타입)

      blog.naver.com/corea4015/220648085184

      digiconfactory.tistory.com/50 (변수 스코프 ,라이프 타임)  

      stage-loving-developers.tistory.com/8 (자바 casting , promotion)

      www.tcpschool.com/java/java_array_twoDimensional (1차원배열 , 2차원배열)

      live-everyday.tistory.com/207 (Type inference 와 var)

반응형