(백기선 라이브 스터디)
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
💡 1주 차 추가과제 : javac 옵션 조사
📌 자바 10에서 javac option관련 레퍼런스
docs.oracle.com/javase/10/tools/javac.htm#JSWOR627
대충 봤으나 뭔지 모르겠다...
중간에 Standard Options for javac부분이 javac 옵션이다.
간단해 보이는것만 대략 끄적여보면..
-g : 로컬 변수를 포함하는 디버깅 정보를 생성한다.
-parameters : 메소드의 파라미터에서 리플렉션을 위한 메타데이터를 생성한다.
-version : 버전 정보를 출력한다.
-Werror : warning이 발생하면 컴파일을 종료한다.
-verbose : 컴파일되는 동안 Output메시지를 보여준다.
-d : 클래스 파일을 위한 디렉터리 위치를 지정한다.
-encoding : 특정 소스파일에 사용되는 encoding타입을 지정한다. 예를들면 EUC-JP , UTF-8
-deprecation : deprecated된 member나 class를 보여준다.
--help or -help : 기본 옵션들에 대한 요약 정보를 보여준다.
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
기본형에는 총 8개의 타입이 있으며, 논리형, 문자형, 정수형, 실수형으로 구분된다.
분류 | 설명 | 타입 |
논리형 | true와 false 중 하나를 값으로 갖는다. | boolean |
문자형 | 하나의 문자만 저장할 수 있다. | char |
정수형 | 정수를 저장하는데 주로 int가 사용되며, byte는 이진 데이터를 다룰 떄 사용, short는 C언어와의 호환을 위해 추가되었다. | byte, short, int ,long |
실수형 | 실수를 저장하는데 주로 double이 사용된다. | float, double |
분류 | 값의 범위 | bit 크기 | byte 크기 | 기본값 |
boolean | true, false | 8 | 1 | false |
byte | -128 ~ 127 | 8 | 1 | 0 |
char | '\u0000' ~ 'uFFFF' | 16 | 2(유니코드) | '\u0000' |
short | -32,768 ~ 32,767 | 16 | 2 | 0 |
int | -2,147,483,684 ~ 2,147,483,647 | 32 | 4 | 0 |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 64 | 8 | 0L |
float | 1.4E-45 ~ 3.4E38 (1.4x10^-45 ~ 3.4x10^38 ) | 32 | 4 | 0.0f |
double | 4.9E-324 ~ 1.8E308 (4.9^10^-324 ~ 1.8x10^308) | 64 | 8 | 0.0 |
2. 프리미티브 타입과 레퍼런스 타입
자료형은 크게 기본형(Primitive type)과 참조형(Reference type)으로 나눌 수 있다.
기본형 변수에는 실제 값이 저장되고 참조형에는 실제 값이 저장된 주소 값을 값으로 갖는다.
기본형
- 기본값이 있기 때문에 Null이 존재하지 않는다. 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용한다.
- 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
참조형
- 기본형을 제외한 모든 타입은 참조형이다.
- 빈 객체를 의미하는 Null이 존재한다.
- 값이 저장되어 있는 곳의 주소 값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
- 참조형 변수의 크기는 JVM이 32bit라면 4byte, 64bit 참조형 변수의 크기는 8byte의 크기를 갖는다.
- 참조 변수에 대한 복사는 여기(깊은 복사와 얕은 복사)에서 확인 바란다.
Reference
gbsb.tistory.com/6?category=735872
3. 리터럴
리터럴이란 데이터 그 자체를 의미한다.
헷갈리니 우선 용어에 대한 정의부터 알아보자.
1. 변수(variable) : 하나의 값을 저장하기 위한 공간
2. 상수(constant) : 값을 한 번만 저장할 수 있는 공간
3. 리터럴(literal) : 그 자체로 값을 의미하는 것
코드로 살펴보자.
int a = 111; // a : 변수, 111 : 리터럴
final int MAX_A = 222; // MAX_A : 상수, 222 : 리터럴
리터럴에도 종류가 있다.(표를 좋아한다.)
종류 | 리터럴 | 접미사 |
정수형 | 123, 1b0101, 0xFF | L |
실수형 | 3.14, 3.0e8, 1,4f | f, d |
논리형 | false, true | 없음 |
문자형 | 'A', '1', '\n' | 없음 |
문자열 | "ABC", "123", "true" | 없음 |
1. 정수형 : 모든 정수 값은 정수 리터럴이다.
int dec = 15; // 10진수 리터럴 15
int bin = 0b1101; // 0b로 시작하니 2진수 리터럴
int oct = 013; // 0으로 시작하면 8진수 리터럴
int hex = 0x13; // 0x로 시작하면 16진수 리터럴
long long_dec = 15L; // long타입 리터럴은 l 또는 L을 붙여 표시한다.
2. 실수형 : 소수점이나 지수 형태의 표현
double a = 0.1122;
double b = 1122E-5; // 1122 * 10 * (-5) = 0.01122와 동일하다
float c = 0.1122f;
double d = .1122D;
3. 논리형
boolean a = true;
boolean b = 10 > 0; // b 는 true
boolean c = 0; // C언어에서와 다르게 boolean type으로 1,0을 참, 거짓으로 사용불가능하다.
4. 문자형 : 더블 쿼트를 이용하면 컴파일 오류 발생
char a = 'D';
char b = "E"; // Compile Error
5. 문자열
- null 리터럴은 레퍼런스에 대입해서 사용한다.
- 기본 타입에는 사용이 불가능하고 String 같은 경우에는 Class여서 사용 가능하다.
int a = null; // compile error
String str = null;
str = "JAVA"
Reference
자바의 정석
https://mine-it-record.tistory.com/100
4. 변수 선언 및 초기화하는 방법
변수를 사용하기 위해서는 변수를 선언하는 작업과 변수를 초기화하는 작업이 필요하다.
변수의 선언 방법은 아래와 같다.
int number;
변수 타입에는 사용하고자 하는 리터럴에 대한 적절한 타입을 적어주면 된다.
여기서 name은 변수의 이름이다. 변수명은 주로 camelCase의 방식으로 만든다. (참고로 데이터베이스에서 테이블이나 컬럼명은 언더스콥을 주로 이용한다(_) )
Clean Code
nextstep에서 교육을 받을 때 좋은 글귀가 있어서 가져왔다.(edu.nextstep.camp/)
- 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
- 그러므로 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하기 바란다. 그러면 (자신을 포함해) 코드를 읽는 사람이 좀 더 행복해지리라.
- 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 소리다.
// 잘못된 사용 예
int d; //경과 시간(단위: 날짜 수)
변수를 선언했으니 이제 변수를 초기화하는 작업을 해야 된다.
변수 초기화란, 변수를 사용하기 전에 값을 할당(저장)하는 작업을 말한다.
메모리는 여러 프로그램이 공유자원으로 사용되므로 초기화하지 않으면 쓰레기 값이 저장되어 있다. (garbage value) 따라서 언제 어디서 오류가 발생할지 모르니 꼭 주의하자.
변수 값을 저장할 때는 대입 연산자(=)를 이용한다.
int number = 1; // int형 변수, 이름은 number를 선언하고 1이라는 값으로 초기화 한다.
5. 변수의 스코프와 라이프타임
1) 변수의 스코프란?
그 변수를 사용할 수 있는 범위(지역)를 말한다. 반대로 말하면 그 지역을 벗어나면 그 변수를 사용하지 못한다.
그렇다면 변수의 종류에 대해서 알아보자
- 지역변수 : 메소드나 생성자 내부에 선언된 변수
- 멤버변수 : 클래스 영역에서 선언된 변수 (클래스 변수와 인스턴스 변수로 나뉨)
- 클래스 변수 : static 블록에서 선언된 변수를 말한다.
- 인스턴스 변수 : 개별 인스턴스마다 갖고 있는 변수
2) 라이프 타임
- 지역변수 : 메소드 블록 영역 내에서만 유지, 메소드가 끝나면 소멸
- 클래스변수 : 클래스 로더에 의해 클래스가 초기화되고 프로그램 종료까지 유지
- 인스턴스 변수 : 인스턴스가 생성되고 메모리에서 살아있을 때까지 유지(GC가 발생하면 소멸된다.)
6. 타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환이란(형변환)?
타입 변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말한다.
형변환에는 2가지가 있다 ( 자동 형변환, 강제 형변환)
형변환 방법은 변환하고자 하는 변수의 타입을 괄호와 함께 붙여주면 된다.
자동 형변환(Type Promotion)
대입 혹은 산술 연산 시에 컴파일러가 자동으로 타입을 변환해 준다.
int a = 1;
double b = a; // 출력해보면 1.0
강제 형변환(Type Casting)
변수의 타입을 괄호와 함께 붙여 형변환하는 방법이다.
int a = 1;
double b = 2;
double c = b / (double) a; // 강제 형변환
System.out.println(c);
7. 1차 및 2차 배열 선언하기
배열 역시 변수와 마찬가지로 선언과 초기화가 가능하다.
1차원 배열 선언하기
- 선언 방법
int[] intArr;
long []longArr;
- 초기화 방법
int[] intArr;
intArr = new int[5]; // 배열의 사이즈는 5로 고정된다.
- 선언 + 초기화 방법
int[] intArr = new int[5]; // 배열의 사이즈만 결정 한다.
int[] intArr2 = {1,2,3,4,5}; // 배열의 사이즈 + 원소을 결정한다.
int[] intArr3 = new int[]{1,2,3,4,5}; // 이렇게도 가능하다.
2차원 배열 선언하기
배열의 배열이라고 생각하면 된다.
- 선언 방법
int[][] intArr;
long [][]longArr;
- 초기화 방법
int[][] intArr;
intArr = new int[3][3]; // 1차원 배열과 같다.
- 선언 + 초기화 방법
int[][] intArr = new int[3][3];
int[][] intArr2 = {{1,2,3},{4,5,6},{7,8,9}};
Reference
keichee.tistory.com/349
8. 타입 추론, var
타입 추론이란 타입이 안정해진 변수 타입을 컴파일러가 유추하는 기능이다.
자바 10부터 추가된 기능이라고 하는데 정확히 어떤 건지 모르겠어서 레퍼런스를 찾아봤다.
아래 레퍼런스에 잘 설명되어 있는 듯하다.
www.baeldung.com/java-10-local-variable-type-inference
대충 var타입으로 선언되며 타입을 예측할 수 있다는 건데.. 자세한 건 피드백 시간에 듣고 블로깅 해야겠다.
//In Java 10, this is how we could declare a local variable:
@Test
public void whenVarInitWithString_thenGetStringTypeVar() {
var message = "Hello, Java 10";
assertTrue(message instanceof String);
}
괜찮았던 스터디원 블로그
notion.so/2-00ffb2aeb41d450aa446675b8a9e91d5
blog.naver.com/swoh1227/222149491648
github.com/hypernova1/TIL/tree/master/java/live-study/2.%20%EC%9E%90%EB%B0%94%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%ED%83%80
%EC%9E%85%2C%20%EB%B3%80%EC%88%98%20%EA%B7%B8%EB%A6%AC%EA
%B3%A0%20%EB%B0%B0%EC%97%B4
'Java' 카테고리의 다른 글
3주차 과제: 연산자 (0) | 2020.11.26 |
---|---|
2주차 과제: 자바 데이터 타입, 변수 그리고 배열(피드백, feedback) (0) | 2020.11.22 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.(피드백 feedback) (0) | 2020.11.15 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.14 |
[java] 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy) (0) | 2020.02.09 |