[Java] 2. 변수 (variable)
이 포스트는 현재 작성중입니다.
미완성된 내용이나 코드가 존재하므로 유의하시기 바랍니다.
변수 (variable) : 하나의 값을 저장할 수 있는 메모리 번지에 붙어진 이름
- 변수의 선언 : 어떤 차입의 데이터를 저장할지, 그리고 변수의 이름이 무엇인지 결정
- 변수의 이름 : 첫번째 글자는 소문자로 시작하되, 캐멀 스타일 (
Camel Style)로 작성하는 것이 관례 - 값의 대입 (
=) : 선언된 변수에 값을 저장 → 변수의 초기화
원시 자료형 (Primitive type) : 선언 시 메모리 주소 위치 (JVM stack)에 실제 값이 저장
논리 리터럴 (Boolean) : 참과 거짓을 의미
- 논리 타입 (
boolean) :true/false
정수 리터럴 (Integers) : 정수를
- 문자 (
char) :''를 이용해 표시 (초기값 :'\0'=0) - 바이트 (
byte) : 데이터를 나타내는 바이트 값 (초기값 :0) - 정수 (
short,int,long) :2,4,8바이트 크기 내의 정수 (초기값 :0) - 실수 (
float,double) :4,8바이트 크기 내의 실수 (초기값 :0.0)
참조 자료형 (Reference type) : 선언 시 메모리 주소 위치에 실제 값이 가리키는 다른 주소를 저장
- 원시 자료형을 기초로 하여 만들어짐 →
Non-Primitive type - 실제 값은
Heap에 저장
자바는 주소값의 추상화를 금지함,
Call by value만 가능 (C/C++: 주소값 저장 (*) 및 추출 (&) 가능)
var : 데이터 타입을 명시하지 않아도 지역 변수의 타입을 자동으로 추론하는 키워드
- 지역 변수만 사용 가능 (
static적용 불가) - 선언과 함께 명시적인 초기화를 반드시 해야 함
NULL로 초기화할 수 없음- 람다 표현식과 같이 사용할 수 없음
var s = 'String';
var n = 100;
변수의 스코프 (Scope) : 변수가 유효한 범위
- 접근 지정자 (
access modifier) : 접근 가능한 수준 지정public: 어느 클래스에서든 해당 클래스에 대해 접근 가능protected: 해당 패키지와 같은 패키지 내에 있는 클래스와 상속받은 클래스가 해당 클래스에 접근 가능default: 해당 클래스와 같은 패키지 내에 있는 클래스만이 해당 클래스에 대해 접근 가능private: 해당 클래스 및 그 클래스를 포함한 클래스만이 해당 클래스에 대해 접근 가능
변수의 라이프타임 (LifeTime) : 변수가 메모리 영역에 저장되어 있는 시간
- 인스턴스 변수 (
static block과static method를 제외한 클래스 전체) : 객체가 생성되어 메모리에 존재하는 동안 - 클래스 변수 (클래스 전체) : 클래스가 초기화되고 프로그램이 끝날 때까지
- 로컬 변수 (변수가 선언된 블록의 내부) : 변수 선언 이후부터 블록을 벗어날 때까지
변수의 형변환 (Type Conversion) : 현재의 타입을 다른 타입올 바꾸는 것
boolean을 제외한 나머지 기본 자료형 간의 타입 변환이 가능
- 타입 프로모션 (
Type Promotion) : 범위가 작은 데이터 타입의 값을 더 큰 범위의 데이터 타입에 할당 (묵시적 형변환)byte<short<int<long<float<double
int intN = 23;
long longN = intN;
- 캐스팅 (
Casting) : 범위가 큰 데이터 타입의 값을 더 작은 범위의 데이터 타입으로 할당 (명시적 형변환)
int n = 100;
c = (char) n;
- 업캐스팅 (
Up-Casting) : 부모-자식 관계의 객체에서 자식 객체를 부모 객체로 형변환 (묵시적 형변환) - 다운캐스팅 (
Down-Casting) : 부모-자식 관계의 객체에서 부모 객체를 자식 객체로 형변환 (명시적 형변환)
class MyClass {
String name;
String ID;
public MyClass(String name){
this.name = name;
}
}
class StudentClass extends MyClass {
String grade;
public StudentClass(String name){
super(name);
}
}
public class UpClass {
public Static void main(String[] args){
MyClass P;
StudentClass S = new StudentClass("I");
P = S; // 업캐스팅 발생
System.out.println(P.name); // 컴파일 오류 없음
S = (StudentClass) P; // 다운캐스팅 발생
System.out.println(S.name); // 컴파일 오류 없음
}
}
배열 (Array) : 인덱스 (Index)와 그 인덱스에 대응하는 데이터들로 이루어진 선형 자료구조
- 배열의 생성 : 배열 공간을 할당받는 과정 (배열에 대한 래퍼런스 변수 선언 + 배열 생성)
- 래퍼런스 변수 : 메모리 상에 생성된 인스턴스를 가리키는 데에 사용되는 변수 (배열의 주소 값을 가짐)
new: 클래스의 새로운 객체를 생성할 때, 객체를 저장할 메모리를 할당하고 생성자를 호출해 객체를 초기화=: 스택의 래퍼런스 변수가 힙의 배열 데이터를 가리킴
int[] intArray;
intArray = new int [10];
int[] intArray = new int [10];
int[] intArray = {1,2,3,4,5,6,7,8,9};
int[][] intArray2;
int intArray2 = new int[2][3];
int intArray2 = { {1, 2, 3}, {4, 5, 6} };
.length필드 : 배열이 가진 길이 (원소의 개수)를 반환
len = intArray.length
len1 = intArray2.length // 2차원 배열이 가진 행의 개수
len2 = intArray2[n].length // 2차원 배열 중 n번째 행이 가진 열의 개수
- 비정방형 배열 : 행마다 열의 개수가 서로 다른 배열
int[][] intArray3 = new int[3][];
intArray3[0] = new int[1];
intArray3[1] = new int[2];
intArray3[2] = new int[3];
int intArray3 = { {0}, {1,2}, {3,4,5} };
int intArray3[][] = { {0}, {1,2}, {3,4,5} };
- 메소드의 배열 반환 : 실제 배열에 대한 래퍼런스가 반환
int makeArray() {
int t = new int[4];
return t;
}
int[] intArr = makeArray();
- 객체 배열 : 객체에 대한 래퍼런스를 원소로 갖는 배열
Person[] people = new Person[20];
for(int i = 0; i < people.length; i++){
people[i] = new Person();
people[i].age = 20 + i;
}
객체 (Object) : 프로그램에서 사용되는 데이터 혹은 식별자에 의해 참조되는 공간
new: 객체를 생성하는 연산자
P = new Person("A");
P.age = 30;
- 생성자 : 객체가 생성될 때 자동으로 호출되는 메소드 (객체에 필요한 초기화 수행)
this: 객체 자신을 참조
class MyClass {
int id;
public MyClass (int x) { // 생성자는 클래스 이름과 동일한 이름을 가짐
this.id = x;
}
public void MyFunc (int id) {
this.id = id;
}
}
this(): 동일한 클래스 내의 다른 생성자를 호출할 때 사용 (반드시 생성자의 첫 문장에서 사용되어야 함)
public MyClass {
String title;
int price;
int id = 0;
public MyClass(String title, int price, int id) {
this.title = title;
this.price = price;
this.id = id;
id += 1;
}
public MyClass(String title, int price, int id) {
this.title = title;
this.price = price;
this.id = id;
id += 1;
}
public MyClass(String title, int price) {
this(title, price, id);
id += 1;
}
public static void main(String[] args) {
MyClass mart1 = new MyClass("apple", 100, 1);
MyClass mart2 = new MyClass("banana", 200);
}
}
- 가비지 컬렉션 (
garbage Collection) :new로 할당받고 사용하지 않는 객체의 메모리 공간을 자동으로JVM에 반환- 소멸자 (
delete)로 객체의 소멸을 명시해야 하는C++과 달리, 자바는 소멸자가 필요 없음
- 소멸자 (
클래스 (Class) : 객체를 생성하기 위해 변수와 메소드를 정의하는 틀
- 필드 (
Field) : 객체의 상태 혹은 속성 (인스턴스 변수,static변수)
public class MyClass {
String name;
static long id;
}
- 메소드 (
method) : 객체의 행동 (인스턴스 메소드,static메소드)
public class MyClass {
string name;
long id;
string getName() {
return name;
}
long getID() {
return id;
}
void setName(String name) {
this.name = name;
}
void setID(long id) {
this.id = id;
}
}
- 생성자 (
Constructor) : 객체를 생성한 후에 필요한 초기화 작업을 수행하는 메소드
public class MyClass {
string name;
long id;
MyClass(String name, long id) {
this.name = name;
this.id = id;
}
}
- 초기화 블럭 (
Initializer) : 객체를 생성한 후에 필요한 초기화 작업을 세분화- 클래스 초기화 블럭 : 클래스가 최초로 로딩될 때
- 인스턴스 초기화 블럭 : 인스턴스가 생성되었을 때
public class MyClass {
string name;
static long id;
// 클래스 초기화 블럭
static {
id = 1;
}
// 인스턴스 초기화 블럭
{
name = "이름";
id += 1;
}
}
캡슐화 (
Encapsulation) : 변수나 메소드는 반드시 클래스 내에서만 구현 가능 / 클래스 안의 내부 클래스 구현 가능public class (클래스 이름) { public static void main(String[] args { ... } class (내부 클래스 1 이름) { ... } static class (내부 클래스 2 이름) { ... } void (내부 함수 이름)() { ... } ... }상속 (
Inheritance) : 부모 클래스에 정의된 필드와 메소드를 자식 클래스가 물려받는 것public class Person { Person() { ... } ... } public class Student extends Person { super(); // 부모 클래스의 생성자를 호출 ... }
instanceof: 객체의 타입을 검사하는 연산자 (상속 관계 & 구현 관계 모두 포함)``` class Lee extends Student implements Person { … }
Lee lee = new Lee(); assertThat(lee instanceof Lee).isTrue(); assertThat(lee instanceof Student).isTrue(); assertThat(lee instanceof Animal).isTrue(); assertThat(lee instanceof Person).isTrue();
```
main() : 해당 클래스를 자바 어플리케이션에서 실행하는 메소드
- 접근 제어자
public: 다른 모든 클래스에서 호출 가능 (클래스 외부의JVM에 의해 호출되어야 하므로) static: 프로그램 시작부터 메모리에 저장됨 (프로그램이 시작할 때부터JVM에 의해 호출되어야 하므로)void: 종료 코드를 등록하기 위해int를 반환해야 하는 ```C``와 달리, 종료 코드를 등록할 필요 없음String[] args: 명령줄에 주어진 모든 인자를 문자열로 처리해main()에 전달
public class (클래스 이름) {
public static void main(String[] args {
...
}
}
static: 모든 객체에 공통으로 사용하기 위해 정적으로 선언 (프로그램 시작부터 메모리에 저장)
static메소드는static멤버만 사용할 수 있고,this키워드를 사용할 수 없음
final : 오직 한 번만 할당할 수 있어 항상 같은 값을 가지는 entity를 정의할 때 사용하는 키워드
final클래스 : 클래스가 상속받을 수 없음
public final class MyClass { ... }
final메소드 : 오버라이딩으로 수정할 수 없음
public final class MySuperClass {
protected final void MyFunc() { ... }
}
public final class MyClass extends MySuperClass {
protected final void MyFunc() { ... } // 컴파일 오류
}
final변수 : 한번 값을 할당하면 수정할 수 없는 상수 정의
static float Pl = 3.141592;
어노테이션 (Annotation) : 컴파일 & 실행 과정에서 코드를 어떻게 처리할지 알리는 메타데이터
- 클래스나 메소드 위에 붙으며,
@로 시작 : 어노테이션의 유무나 어노테이션에 설정한 값을 통해 클래스를 다르게 실행
@Override // 메소드를 오버라이딩 (상속받은 부모 클래스나 인터페이스에서 해당 메소드가 없으면 컴파일 오류)
자바 모듈 (Java Module) : 클래스, JAR, 패키지 수준의 코드 그룹화 제공
- 하나의 자바 어플리케이션은 하나 이상의
.class파일로 구성 - 다수의 클래스 파일을
.jar파일로 압축해 배포 및 실행 가능 - 서로 관련 있는 클래스들은 하나의 패키지로 묶어서 관리
JDK의 Scanner 클래스 : 자바의 키 입력 (Key input)
String next(): 문자열 타입으로 반환Byte nextByte(): 바이트 타입으로 반환short nextShort(),int nextInt(),long nextLong(): 정수 타입 (short,int,long)으로 반환float nextFloat(),double nextDouble(): 실수 타입 (float,double)으로 반환String nextLine(): 한 줄 전체 (\n)를 일고 문자열 타입으로 반환
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
String name = scan.nextLine();
자바 표준 입력 스트림
system.in: 입력되는 키 값을 바이트 정보로 반환 (문자 정보로 변환)InputSteamReader rd = new InputSteamReader(System.in); // 키보드 입력 스트림 생성 int s = rd.read(); // 키보드로부터 문자 하나를 읽고 이를 s에 저장
예외 처리 (Exception handling) : 발생한 예외에 대해 작성한 프로그램 내에서 대응하는 것
- 예외 (
Exception) : 프로그램 실행 중에 발생하는 런타임 오류 (Runtime error)Checked Exception: 컴파일러에 의해 예외 발생을 인지 (컴파일 오류)Unchecked Exception:JVM에서 예외 발생을 인지 (예외 객체 생성 후 처리)
자바에서 자주 발생하는 예외
NullPointerException:Null래퍼런스를 참조할 때 발생ClassCastException: 변환할 수 없는 타입응로 객체를 변환할 때 발생IOException: 입출력 동작 중에 인터럽트가 발생할 때 발생NumberFormatException: 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환할 때 발생IllegalArgumentException: 잘못된 인자를 전달할 때 발생ArrayIndexOutOfBoundsException: 배열의 범위를 벗어나 접근할 때 발생NoSuchMethodException: 런타임 시점에 존재하지 않는 메소드를 호출할 때 발생
try-catch-finally: 발생한 예외에 대한 예외처리를 하는 구문try: 오류가 발생할 것으로 예상되는 부분catch: 발생할 오류에 관련된 예외에 대해 대응할 부분finally: 예외 발생 여부에 상관없이 반드시 실행되어야 하는 부분throws: 예외 처리의 의무를 현재 예외가 발생한 메소드에서 그 메소드를 호출한 메소드로 전달
public void funcA() {
try {
...
} catch (Exception e) { // 예외가 발생할 때 생성된 예외 객체와 타입이 일치하면, 래퍼런스 변수가 생성된 예외 객체를 가리킴
...
} finally {
...
}
}
public void funcB() throws Exception { // throws로 예외 처리를 Exception로 전달
...
}