Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

까마귀코딩.log

백기선 자바스터디 02주 본문

백기선 자바스터디

백기선 자바스터디 02주

까마귀코딩 2023. 1. 26. 16:37
더보기
왜?    라는 생각을 달고   살자!

<< 총 15주차 까지 진행되며 주어지는 키워드를 가지고 블로그에 정리하며 공부하는 스터디 입니다 ! >>


 

 목표

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


 

 

02주차에서 학습할 것 ?

 

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

 

 


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


JAVA 에서 Primitive Type 이란 ??

 

 ↳  자바에서 제공하는 기본변수 타입을 말한다.

 

 

 

 

 

여기서 타입이란 뭘까 ?? 

컴퓨터가 읽어들일 때 , 해당 데이터를 어떻게 식별할지 알려주는 분류기준 이라고 생각하면 된다.

 

사진과 같이 총 8개로 구성되어있다.

 

 

기본값들이 지정되어 있는거로 아는데 기본값들에 대해 알아보자 !!

 

 

 

정수타입 < byte, short, int > 의 기본값 ==  0 /  < long > == 0L

 

실수타입 < float > == 0.0f  / < double > == 0.0

 

문자타입 < char > == \u0000

 

논리타입 < boolean > == false

 

 

 

 

메소드를 통해서 프리미티브 타입 변수가 매개변수로 보내지면 ??

CALL BY VALUE 로 변수를 호출해 메모리에서 변수의 값을 복사해 사용한다 ^^

 

 

 


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


프리미티브 타입과 래퍼런스 타입의 차이점은 뭘까 ?  

그리고 뭘 두 분류로 나눈걸까?

 

 

 

 

값의 호출방식 ! 

이것이 가장 큰 차이점이다.

 

 

프리미티브 타입의 경우

( Call By Value ) 로 변수를 호출하므로,

메모리에서 변수의 값을 복사해서 사용하기 때문에 

변수의 값을 바꾸더라도 메모리에 있는 값이 바뀌지 않는다.

 

하지만,

래퍼런스 타입의 경우

( Call By Reference ) 로 호출한다.

 

 

 

여기서 Call By Reference 란? 

호출되는 변수의 메모리 주소를 복사해서 사용하는것이다.

 

따라서, 참조에 의한 호출로 가져온 변수의 값을 바꾼다면 ? 

메모리 주소를 참조하여 사용했기 때문에 값이 바뀐다.

 

 

 

 

 

 

 


3. 리터럴 ?? 


 

리터럴은 뭘까 ? 

리터럴의 정의는 소스코드의 고정된 값을 말하는것이다.

 

 

< 뭔말인지 잘 모르겠다.. 🙀 예를 들어보자 >

 

 

 

리터럴의 정의는 소스코드의 고정된 값이다.

정의만 봐서는 무슨말인지 감이 오질 않는다.

 

 

 

 

예를들면,

더보기

int  a  = 10; 

 

여기서  a 의 값은 10 이다.

 

 

 

그렇다면 10이 리터럴인 것이다 ! 

와 짱쉬워 !

 

 

 

 

 

까먹지말자!

 

 

 

 


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


 

변수 선언은??

'식별자 이름을 붙이는 규칙'을 지키면서 변수를 선언해 주어야 한다. 그럼된다~

 

더보기

변수 선언의 예

1
2
3
int i;
double d; 
char c1, c2;
cs

 

왼쪽에 파란 글씨로 표현된게 데이터 타입이고, 오른쪽에 있는 i, d, c1, c2이 모두 변수명이다.

 

만약 같은 데이터 타입의 변수 여러개를 동시에 선언하고 싶다면???

변수명을 콤마(,)로 구분해서 작성하면 된다 !!

 

 


 

변수의 종류에는 다음과 같이, 필드(멤버,전역 변수) 와 지역변수로 나누어져 있는데 이 둘은 선언하는 장소가 다르다.

 

변수 종류와 예시

 

멤버변수는 ? ? ?  클래스에 생성한 변수,

지역변수는 ? ? ?  메소드 안에서 (지역적으로) 선언한 변수를 말한다 ! 

 

 

 

 

 

 

 

 

변수 초기화 ??

- 변수를 선언하고 첨으로 값을 저장하는것을 변수의 초기화 라고 한다.

 

필수적이기도 하고 / 선택적이기도 하다 

어떤경우를 기준으로 달라질까 ?? 

 

일단, 선언과 동시에 적절한 값으로 초기화 하는것이 바람직하다.

 

 

 

멤버변수는 초기화는 하지 않아도 자동적으로 변수타입의 기본값으로 초기화 된다 !

지역변수는 사용전 반드시 초기화 해야한다 !!

 

지역변수의 초기화는 필수 필수적이다 !

 


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


난생처음 듣는

변수의 스코프 !!

 

뭔말일까 ? 진짜 별거없다.

변수를 사용할 수 있는 범위 라고 생각하면 된다.

 

 

 

난생처음 듣는

변수의 라이프타임 !!

 

그건또 뭔말일까 ? 진짜 별거없다.

변수가 메모리 영역에 저장되어있는 시간이라고 생각하면 된다

 

 

 


 

구분은 그렇게 했고,  좀더 깊게 파보자


 

 

변수가 선언된 블럭이 있다 .

그것이 그 변수의 사용범위이다 .

 

프로그램상에서 사용되는 변수들은 사용가능한 범위를 가진다.

그 범위를 변수의 스코프라고 한다.

 

 

 

변수스코프 예시클래스 

    public class ValableScopeExam{

        int globalScope = 10;   // 인스턴스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScpe);
            System.out.println(value);
        }
    }
  • 클래스의 속성으로 선언된 변수 globalScope 의 사용 범위는 클래스 전체 이다.
  • 매개변수로 선언된 int value 는 블럭 바깥에 존재하기는 하지만, 사용범위는  해당 메소드 블럭 내이다.
  • 왜 ???? 메서드 선언부에 존재하므로   !!
  • 메소드 블럭내에서 선언된 localScope 변수의 사용범위는 메소드 블럭 내이다.

 

 

 

 

 

main메소드에서 사용하기

    public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  //오류
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
        }   
    }
  • 같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없다.
  • main은 static한 메소드이다. static한 메서드에서는 static 하지 않은 필드를 사용 할 수 없다.

 

 

static한 변수

    public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //사용가능 
        }

    }
  • 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
  • main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다.
  • 이런 메서드를 static 한 메소드 라고 한다.
  •  필드 앞에 static 키워드를 붙인 static한 필드나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.

 

 

static한 변수는 공유된다.

 

 

    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다. 
  • golbalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
  • staticVal같은 static한 필드를 클래스 변수라고 한다.
  • static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다.
  • 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
  • 클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다고 하다.
    • VariableScopeExam.staticVal

 

 

 

 

 

 

 


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


 

변수 또는 상수의 타입을 다른 타입으로 변환 ?? 

 

연산을 수행하는 코드에서는 같은 타입끼리만 가능하다.

그래서 연산을 수행하기 전에 같은 타입으로 만들어야 하는데
타입 변환을 하는 것을 형변환 이라고 한다.

 

 

 

 

캐스팅과 프로모션 ?

- 캐스팅(명시적 형 변환) : 큰 데이터 타입에서 작은 데이터 타입으로 형 변환
- 프로모션 (자동/묵시적 형변환) : 작은 데이터 타입에서 큰 데이터 타입으로 형 변환

 

 

 

 

 

 

프로모션은 자동변환 !

: 작은 데이터 타입에서 데이터 타입으로 형 변환 !

 

 

 

가능범위 !

 

 

short shortNum = 100;

int intNum = shortNum;                // 확장성에 의한 자동 변환 (short -> int)
System.out.println(intNum);

반대로 축소 변환(Narrowing conversion)의 경우에 호환성이 없기 때문에 자동적으로 변환할 수 없어 컴파일 에러가 발생한다.

 

 

int intNum = 1;
short shortNum = intNum; //컴파일 에러

그러면 어떻게 하면 될까 ? 

 

강제 / 명시적 형변환을 사용하면 된다 == 캐스팅

int intNum = 1;
short shortNum = (short)intNum; //컴파일 에러 해결

컴파일 에러는해결된다 

근데 나중에 문제가 발생할수 있다 ( 디버깅이 어렵게 된다 )

 

ㄴ> 근데 왠만하면 크기가 짝은거로는 형변환안하는게낫다 ~ 

나중에 에러찾기가 힘들어짐 

 

 

 


7.  1차 배열선언과  / 2차 배열 선언하기??


 

1차배열이 여러개 모인것을 다차원 배열이라고 한다.

 

 

배열안의 배열도 또한 포함된다. 

원하는 차원수 만큼의 배열기호 [ ] 를 추가하면 된다. -> 그냥 나열하면 된다.

 

 

 

 

 

 

배열(Array)

: 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.

 

 

 

 

new 로 선언 되었으니 heap에 저장 ~! 

 

 

 

 

 

 

2차배열 이상의 선언은 아까 말했듯이 1차원 배열에서 나열선언하면 된다~

 

 

 

 


8. 타입 추론 ?? 

 

타입추론은 말그대로 개발자가 변수의 타입을 명시적으로 적어주지 않고도,

컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것이다. 

대표적인 타입추론 언어는 자바스크립트, 코틀린, 스위프트 등이 있다.

 

 

알필요없다 

최근나온 jdk사용할때 공부해라

 


8 .  v a r ??


Java 10부터 var 구문이 생겼다 !

 

Var는 초기화값이 있는 지역변수 (Local Vairable)로만 선언이 가능하다.

 

Var는 키워드(KeyWord)가 아니다.

 

Var는 런타임 오버헤드가 없다. 

 

 

 

 

foreach

더보기

그냥 우리가 리스트 열거할 때 쓰던 for문, for each (Person person : personList) 문에서

변수 선언할 때 var로 쓰면 편하다.

이클립스나 인텔리제이나 for문 쓸때, 타입 추론하기엔 열거 타입을 정의할 때까지 타입을 직접 작성하거나,

템플릿을 작성해야 해서 난감할 때를 많이 겪어봤을 것이다.

이를 var 키워드가 순식간에 해결해준다 !!

더보기
for (var person : personList) {
    // ...
}

이렇게 작성하면 IDE 에서는 

var 키워드를 Person 클래스로 인식할 수 있는 기회가 주어지게 되고,

컴파일할 때도 var 키워드를 Person 으로 변환하게 될 것이다.

타이핑이 정말 간결해진다 !!  Object 타입으로 미리 단정지을 필요도 없다 !!

 

 

 

 

 

 

 

 

 

 

 

생각보다 'var'는 할 수 있는게 많이 없구나? 이렇게 생각할 수 있다.

 

하지만   !

이런식으로 구성된 람다 익스프레션이 있다.

 

 

 

 

자 여기서 타입추론이 꽤나 유용하게 사용할 수 있는데, 

이렇게 변수 앞에 var를 넣을 수 있다. 

 

 

 

 

아그러면 뭐가 다른건데? 똑같은거 아니야? 걍 ‘s’ 만 쓰는게 더 가독성 좋지않아???

 

 

싶겠지만  이렇게 키워드 앞에만 사용할 수 있는 어노테이션을 사용할 수 있다는 장점이 있다.