본문 바로가기

Languages/Java

[Java] 변수, 자료형

변수

- 지역 변수

- 매개 변수

  메소드나 생성자에 넘겨주는 변수. 메소드가 호출될 때 생명이 시작되고, 메소드가 끝나면 소멸됨. (정확히는 호출될 때      시작하진 않음)

- 인스턴스 변수

  메소드 밖에, 클래스 안에 선언된 변수, 앞에는 static이라는 예약어가 없어야 함. 객체가 생성될 때 생명이 시작되고, 그 객

  체를 참조하고 있는 다른 객체가 없으면 소멸됨.

- 클래스 변수

  인스턴스 변수처럼 메소드 밖에, 클래스 안에 선언된 변수 중에서 타입 선언 앞에 static 이라는 예약어가 있는 변수. 클래

  스가 생성될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸됨.

public class VariableTypes{
	int instanceVariable;
    static int classVariable;
	public void method(int parameter){
    	int localVariable;
    }
}

※자바에서는 객체를 더 이상 사용하지 않으면 자동으로 없어짐. 가비지 콜렉터(Garbage collector)가 때가 되면 알아서 메모리를 청소해주기 때문에, 자바는 C/C++와 달리 개발자가 임의로 더이상 사용하지 않는 변수를 메모리에서 지울 수 없음.

 

 

기본 자료형과 참조 자료형

기본 자료형 : new 없이 바로 초기화 가능. byte, short, int, long, float, double, char, boolean

int a=10;

참조 자료형 : new를 사용해서 초기화

Calculator calc=new Calculator();

!!참조 자료형 중에서 String만 초기화할 때 new를 사용해서 객체를 생성하지 않아도 되는 유일한 타입.

String bookName1="Basic Java";	// 대부분 이렇게씀
String bookName2=new String("Basic Java");

둘 다 가능.

 

 

기본 자료형의 기본값

인스턴스 변수, 클래스 변수, 매개 변수는 값을 지정하지 않아도 컴파일이 되지만, 지역 변수는 기본값이 적용되지 않음.

지역 변수를 만들어 놓고 사용하지 않을 때에는 초기화를 하지 않아도 되지만, 사용할 때에는 반드시 초기화를 해야 함.

 

*오류 코드

public class ProfilePrint{
  byte age;
  public void setAge(byte age){
    this.age=age;  
  }
  public static void main(String args[]){
    ProfilePrint pp=new ProfilePrint();
    pp.setAge(22);
  }
}

오류 발생 원인 : 자바에서 정수 리터럴(literal)은 기본적으로 int타입으로 처리됨. 따라서 setAge 메서드의 매개변수가 byte타입이라 하더라도 정수 리터럴을 그래도 전달하면 컴파일러가 해당 리터럴을 int 타입으로 인식함. 이로 인해

"incompatible types: possible lossy conversion from int to byte"오류가 발생함

 

 

*해결 코드

public class ProfilePrint{
  byte age;
  public void setAge(byte age){
    this.age=age;  
  }
  public static void main(String args[]){
    ProfilePrint pp=new ProfilePrint();
    byte age=22;
    pp.setAge(age);
  }
}

byte형 변수를 새로 생성하여 메소드 매개 변수로 전달.

이 때, main메소드 안에 있는 age변수와 main메소드 밖에 있는 age변수는 서로 다른 변수임. main메소드 안에 있는 age 변수는 main 내부에서만 유효하며 해당 블록({ ... })안에서만 접근 가능.

반면 클래스 ProfilePrint의 멤버 변수로 선언된 age 변수는 클래스의 멤버로서 클래스의 모든 메서드에서 접근 가능.

클래스 멤버 변수 age는 main 메소드에서도 사용 가능하지만, 해당 변수에 접근할 땐 클래스 인스턴스를 통해 접근해야함. pp.age=22;pp.setAge(pp.age);이렇게.

 

pp.setAge((byte) 22); // 22를 byte 타입으로 강제 변환하여 전달

정수 리터럴에 접미사를 붙여 byte 타입 리터럴을 전달하여 오류 방지

 

 

'Languages > Java' 카테고리의 다른 글

[Java] 패키지, 접근제어자  (0) 2023.08.19
[Java] 매개 변수 지정  (0) 2023.08.19
[Java] Static과 Static 블록  (0) 2023.08.11
[Java] 배열  (0) 2023.08.11
[Java] 자바 기초  (0) 2023.08.11