B4 Junior

📚 JAVA 기본 개념 - 변수

꿀젤리 2023. 4. 5. 14:18

📚 개요

자바 기본 개념 까먹었을 때 찾기 귀찮음

나만 보려는 생각으로 적었기에 누구나 보기에 좋진 않다.

1. 변수란?

변수란 말 그대로 변할 수 있는 수를 말한다.

이와 상반되는 개념으로 상수 (Const) 라는 개념이 있다.

변수와 상수 모두 비즈니스 로직이 동작하기 위해서 사용된다.

 

2. 변수 선언

아래는 변수 선언의 기본형과 실제 변수 선언의 코드이다.

TypeName VariableName (optional){ = initialValue};
	public static void main(String[] args) {
		int noInitialValueInt;
		int initialValue = 0;

		// System.out.println(noInitialValueInt); ==> error
		System.out.println(initialValue);
	}

initialValue 를 변수 선언시에 해주지 않았다면 사용이 불가능하다.

 

3. 변수 종류

변수의 종류에는 아래와 같은 것들이 있다.

  • 기본형 변수
  • 참조 변수
  • 멤버 변수
  • 클래스 변수
  • 인스턴스 변수
  • 지역 변수
  • 매개 변수

 

4. 기본형 변수

위와 같이 사용한 변수가 기본형 변수에 해당한다.

TypeName VariableName (optional){ = initialValue};

TypeName 에 들어가는 타입 중 byte, short, char, int, long, float, double, boolean 총 8가지의 기본 타입이 있다.

기본형 타입의 특징이다.

  • 모두 소문자로 시작된다
  • 비객체 타입이므로 null 값을 가질 수 없다. (기본값이 정해져 있음)
  • 변수의 선언과 동시에 메모리 생성
  • 모든 값 타입은 메모리의 스택(stack)에 저장
  • 저장공간에 실제 자료 값을 가진다

사용 예시

		// 정수 타입
		byte byteType = 10; // - 128 ~ 127
		short shortType = 10; // -32768 ~ 32767
		char charType = 'A'; // 0 ~ 65535
		int intType = 100; // -2,147,483,648 ~ 2,147,483,647
		long longType = 1000; // -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
		// 실수 타입
		float floatType = 1.1F; // (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
		double doubleType = 1.1; // (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값
		// 논리 타입
		boolean booleanType = false; // true or false

 

5. 참조 변수

byte, short, char, int, long, float, double, boolean 총 8가지의 기본 타입을 제외한 나머지 타입들을 말한다.

총 4가지 타입이 있다.

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

참조형 타입의 특징이다.

  • 기본형 과는 달리 실제 값이 저장되지 않고, 자료가 저장된 공간의 주소를 저장한다.
  • 즉, 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.
  • 메모리의 힙(heap)에 실제 값을 저장하고, 그 참조값(주소값)을 갖는 변수는 스택에 저장
  • 참조형 변수는 null로 초기화 시킬 수 있다

배열 선언

//크기 할당 & 초기화 없이 배열 참조변수만 선언
int[] arr;
int arr[];

// 선언과 동시에 배열 크기 할당
int[] arr = new int[5];
String[] arr = new String[5]; 

// 기존 배열의 참조 변수에 초기화 할당하기
int[] arr;
arr = new int[5]; //5의 크기를 가지고 초기값 0으로 채워진 배열 생성

// 선언과 동시에 배열의 크기 지정 및 값 초기화
int[] arr = {1,2,3,4,5}; 
int[] arr = new int[]  {1,3,5,2,4};    
int[] odds = {1,3,5,7,9};  
String[] weeks = {"월","화","수","목","금","토","일"};

// 2차원 배열 선언
int[][] arr = new int[4][3];   //3의 크기의 배열을 4개 가질 수 있는 2차원 배열 할당  
int[][] arr9 = { {2, 5, 3}, {4, 4, 1}, {1, 7, 3}, {3, 4, 5}};
//arr[0] >> {2, 5, 3};
//arr[1] >> {4, 4, 1};
//arr[2] >> {1, 7, 3};
//arr[3] >> {3, 4, 5};

 

열거형 선언

	public enum Weeks {
		  MONDAY("mon", 10),
		  TUESDAY("tue", 20),
		  WEDNESDAY("wed", 30),
		  THURSDAY("thu", 40),
		  FRIDAY("fri", 50), 
		  STURDAY("sat", 60),
		  SUNDAY("sun", 70);
		  
		  private final String name;
		  private final int value;
		  
		  private Weeks(String name, int value) {
		  	this.name = name;
		    this.value = value;
		  }
		  
		  public String getName() {
		  	return this.name;
		  }
		  
		  public int getValue() {
		  	return this.value;
		  }
		}

	public static void main(String[] args) {
		for (Weeks week : Weeks.values()) { // mon, tue, wed, thu, fri, sat, sun
			System.out.println(week.getName());
		}
	}

클래스

접근제어자 종류

  • public
  • private
  • protect

위 세개에 대한 내용은 따로 빼겠다.

<< Fixed : 글 작성 링크 >>

 

사용 예시

package developer;

public class Developer {
	private String name;
	public String position;
	
	public Developer () {}
	public Developer (String name, String position) {
		this.name = name;
		this.position = position;
	}
	
	public String getName() {
		return this.name;
	}
	
	public String getPosition() {
		return this.position;
	}
	
	public void setPosition(String position) {
		this.position = position;
	}
}

이런식으로 클래스를 작성한 뒤

Developer dev = new Developer("An", "backend");
System.out.println(dev.getPosition()); // backend 출력

이런식으로 사용하면 된다.

 

인터페이스

접근제어자 interface 인터페이스이름 {
    public static final 타입 상수이름 = 값;
    ...
    public abstract 메소드이름(매개변수목록);
    ...
}

모든 멤버변수는 public static final 이어야 하고

모든 멤버메소드는 public abstract 로 선언되어야한다.

 

클래스를 두고 인터페이스를 사용하는 이유

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.

인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.

 

사용 방법

public interface Developer {
	public static final int speed = 30;
	// public int speed = 30; 으로도 가능
	
	public abstract void coding();
	// public void coding(); 으로도 가능 
	
	default int getSpeed(int level) {
		return level * speed; 
	};
}

인터페이스를 만들어줍니다. 이 인터페이스를 구현하는 클래스는 전부 인터페이스에 있는 메소드와 값을 가집니다.

클래스로 인터페이스의 내용을 구현합니다.

public class DeveloperImpl implements Developer {
	private String name;
	private int level;
	private String position;
	
	public DeveloperImpl() {}
	public DeveloperImpl(String name, int level, String position) {
		this.name = name;
		this.level = level;
		this.position = position;
	}
	
	public int getLevel () {
		return this.level;
	}
	
	@Override
	public void coding() {
		// TODO Auto-generated method stub
		System.out.println("열심히 코딩중...");
	}

그리고 사용

public static void main(String[] args) {
    DeveloperImpl dev = new DeveloperImpl("An", 50,"backend");
    System.out.println(dev.getSpeed(dev.getLevel())); // 1500
    dev.coding(); // 열심히 코딩중... 출력
    System.out.println(dev.speed);
}

 

6. 변수 선언 규칙

 

일반적인 규칙

  • 첫 문자가 문자나 '_', '$'의 특수문자로 시작되어야 한다. 숫자로 시작할 수 없다.
  • 첫 문자가 아니라면, 문자나 '_', '$'의 특수문자 그리고 숫자로 구성될 수 있다.
  • 자바의 예약어는 식별자로 사용할 수 없다.
  • 자바의 식별자는 대소문자를 구분한다.
  • 식별자 길이는 제한이 없고 공백은 포함할 수 없다.

변수 선언 예시

  • 클래스 이름: ClassName
  • 메서드 이름: getValue, get_Value
  • 변수 이름: $value, variable_Value
  • 상수이름: CONSTANT_VALUE

🔗 출처

클래스 구성 - http://www.tcpschool.com/java/java_class_declaration