JAVA

[JAVA #1] 2. 변수(variable)

lyndaa 2023. 2. 21. 17:07
  • 변수
    • 메모리 공간(RAM)에 한 개의 값을 기록하기 위한 장소(공간)
  • 변수의 자료형
    • 기본형
      • 실제 데이터(값)을 저장
      • 논리형, 문자형, 정수형, 실수형으로 나눠지고 8개의 자료형이 있음
      • 각 자료형 별 데이터 저장크기가 다름
    • 참조형
      • 데이터가 저장되어 있는 주소를 저장(객체의 주소)
      • 기본형을 제외한 나머지(String 등), 사용자 정의 자료형
      • 4byte의 공간을 저장공간으로 할당
  • 자료형
    • 논리 boolean 1byte
    • 문자 문자 char 2byte ' '
    • 문자 문자열 string 참조형 " "
    • 숫자 정수형 byte 1byte short 2byte int(기본) 4byte long 8byte
    • 숫자 실수형 float 4byte double(기본) 8byte (유니코드 : 문자를 숫자로 표현)
  • 변수의 선언
    • 메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것
    • 자료형 : 변수 타입 지정
    • 변수명 : 변수명 지정

* 변수 선언 실습

package com.test01;

public class Variable01 {
	
	public static void main(String args[]) {
		//준비
		//클래스명 변수명 = new 클래스명();
		//실행
		//변수명.메소드명();
		
		Variable01 test = new Variable01();
		test.declareVariable();
		
		test.initVariable();
	}
	
	//타입 변수명 = 값 !
	//타입 - 생성할 변수에 어떤 종류의 값이 들어갈지 타입 지정
	//변수명 - 변수의 이름
	// 값 - 변수에 저장할 데이터
	public void declareVariable() {
		//변수의 선언
		
		//숫자형
		//정수형
		byte bnum;
		short snum;
		int inum;
		long lnum;
		
		//실수형
		float fnum;
		double dnum;
		
		//논리형
		boolean isTrue;
		
		//문자형
		char ch;
		
		//문자열(참조형)
		String str;
		
		//------------
		//대입
		bnum = 1;
		snum = 2;
		inum = 4;
		lnum = 8L;
		
		fnum = 4.0F;
		dnum = 8.0;
		
		isTrue = true;
		
		ch = 'A';
		str = "A";
		
		//변수에 저장된 값 출력
		System.out.println(inum);
		System.out.println(dnum);
		System.out.println(isTrue);
		System.out.println(ch);
	}
	
	public void initVariable() {
		//변수 선언과 동시에 초기화
		int inum = 4;
		double dnum = 8.0;
		boolean isTrue = false;
		String str  = "Hello World";
		
		//변수 값 출력하기
		System.out.println(inum);
		System.out.println(dnum);
		System.out.println(isTrue);
		System.out.println(str);
		
	}
	
}
  • 변수의 명명 규칙
    • 대소문자 구분, 길이 제한 없음
    • 예약어 없음
    • 숫자로 시작하면 안된다
    • 특수문자는 '_'와 '$'만을 허용
    • 여러 단어 이름은 단어의 첫 글자를 대문자로(camel 표기법 e.g. useName)
  • 변수의 초기화
    • 변수를 사용하기 전에 처음으로 값을 저장하는 것 -> 지역변수는 반드시 초기화 필요 (전체에서 쓸 수 있는 것 전역변수)
    • 변수는 메서드 안에서만 쓸 수 있다. -> 특정 지역 안에서만 쓸 수 있다->지역변수
    • 값 대입
    • 리터럴 : 변수에 대입되는 값 자체를 의미
  • 상수
    • 한번 값을 저장하면 변경 불가능
    • final
    • 상수 선언 시 대문자
  • 문자열
    • 다른 자료형 + "문자열" -> 문자열
  • 데이터 오버플로우
    • e.g. byte형
      • 127+1을 하면 범위를 초과한 128이 되고 허용된 범위 이상의 비트를 침범하게 되는데 이를 오버플로우라고 한다.
      • byte형 허용범위 최소값인 -128이 되는 것이다.

*상수와 오버플로우 실습

package com.test01;

public class Variable03 {
	
	public static void main(String args[]) {
		//상수 테스트
		int age;
		final int AGE;
		
		age = 19;
		AGE = 19;
		
		System.out.println("age: " + age);
		System.out.println("AGE: " + AGE);
		
		age = 20;
		//AGE = 20;
		//에러 발생, 상수 변경 불가
		
		
		//오버플로우 (순환이 된다)
		//byte bnum = 128;
		//에러 발생, 범위 벗어난 값
		
		byte bnum = 127;
		bnum = (byte)(bnum + 1);
		
		System.out.println("bnum: " + bnum);
		
	}
	
}
  • 형변환 (casting)
    • 컴퓨터의 값 처리 원칙(같은 종류 자료형만 대입, 계산 가능)이 지켜지지 않은 경우에 형 변환이 필요함 
    • 자동 형변환 : 연산 시 컴파일러가 자동으로 형이 변환하는 것을 의미 byte -> short char -> int -> long -> float -> double *byte와 short 연산 시 자동으로 결과값을 int형으로 반환
    • 강제 형변환(명시적 형변환) : 자료형으로 형변환을 해줄 수 있다. 데이터가 큰 자료형에서 작은 자료형으로 변경 시 데이터 손실이 있을 수 있어 유의해야 한다.

* 형변환 실습

package com.test01;

//형변환
public class Variable04 {
	//프로그램의 시작점
	public static void main(String[] args) {
	//1.준비
	//클래스명 변수명 = new 클래스명();
	Variable04 test = new Variable04();
	//2.실행
	//변수명.메소드명();
	test.test1();
	test.test2();
		
	}
	
	public void test1() {
		int num = 'A';
		System.out.println(num);
		
		char ch = 97;
		System.out.println(ch);
		
		//음수값 저장 불가능
		//ch = -97;
		
		//int 자료형 변수의 값은 강제 형변환 해야한다.
		char ch2 = (char)num;
		System.out.println(ch2);
		
		int no = -97;
		char ch3 = (char)no;
		System.out.println(ch3);
		
	}
	
	public void test2() {
		int inum = 10;
		long lnum = 100;
		
		//두 변수 연산 후 isum에 담으려면 에러 발생
		//int isum = inum + lnum;
		
		//1.
		int isum = (int)(inum + lnum);
		System.out.println(isum);
		
		//2.
		int isum2 = inum + (int)lnum;
		System.out.println(isum2);
		
		//3.
		long lsum = inum + lunm;
		System.out.println(lsum);
		
	}
	
}
  • 변수와 메모리 구조

  • escape 문자

  • 출력 메소드
    • System.out.print() / System.out.println() -> 줄바꿈
    • System.out.printf("%형식", 변수 등)
      • %d : 정수형, %o : 8진수, %x : 16진수 
        %c : 문자, %s : 문자열
        %f : 실수(소수점 아래 6자리), %e : 지수형태표현, %g : 대입 값 그대로 
        %A : 16진수 실수
        %b : 논리형 
        정렬방법
        -   %5d : 5칸을 확보하고 오른쪽 정렬 
        -   %-5d : 5칸을 확보하고 왼쪽 정렬 
        -   %.2f : 소수점 아래 2자리까지만 표시
  • Scanner
    • 정수 : sc.nextInt();
    • 실수 : sc.nextFloat(); 또는 sc.nextDouble();
    • 문자열 : sc.next(); 또는 sc.nextLine(); 

* 입출력 실습

package com.test01;

import java.util.Scanner;

public class Variable02 {
	
	//메인메서드 있어야 동작을 함
	public static void main(String args[]) {
		//준비 : 클래스명 변수명 = new 클래스명();
		Variable02 test = new Variable02();
		
		//실행 : 변수명.메소드명();
		test.inputTest();
		
	}
	
	public void inputTest() {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("이름 입력 : ");
		String name = sc.nextLine(); //next(), nextLine()
		
		System.out.print("나이 입력 : ");
		int age = sc.nextInt();
		
		System.out.print("키 입력(소수점 첫째 자리까지) : ");
		double height = sc.nextDouble();

		System.out.println(name + "님은 " + age + "세이고, 키는 " +height + "cm입니다.");
		
		String str = "기차" + 123 + 45 + "출발";
		String str2 = 123 + 45 + "기차" + "출발";
		System.out.println(str);
		System.out.println(str2);
		
	}
	
}
  • 메소드 불러오기
    • e.g.
      • Operator05 o = new Operator05();
      • o.test01();
      • o.test02();
      • new Operator05().test01();
      • new Operator05().test02();
  • 메소드 종류
    • 클래스 메소드
      • 정적 메소드이므로 static을 붙여서 선언된 메소드 
      • 변수나 메소드 앞에 static이 붙는다면 이 메소드는 어디서든 부를 수 있음
    • 인스턴스 메소드
      • 비정적 메소드이므로 non-static 메소드로 선언된 메소드 
  • 접근제한자 종류 
    • public : 어디서나 실행 가능
    • protected : 상속 시 상속된 곳, 상속이 아닌 경우 같은 패키지 내에서 실행 가능
    • default : 같은 패키지 내에서 실행 가능
    • private : 현재 클래스 내에서 실행 가능

* 접근제한자 실습

package com.test01;


public class MethodTest01 {
	
	public static void main(String[] args) {
		MethodTest01.publicMethod();
		MethodTest01.protectedMethod();
		defaultMethod();
		privateMethod();
	}
	
	//접근제한자 : public protected default private
	
	//어디서나 접근(실행) 가능 (+)
	public static void publicMethod() {
		System.out.println("public method");
	}
	
	//상속 시 상속된 곳에서
	//상속이 아닌 경우 같은 패키지 내에서 (#)
	protected static void protectedMethod() {
		System.out.println("protected method");
		
	}
	
	//같은 패키지 내에서 (default)
	static void defaultMethod() {
		System.out.println("default method");
	}
	//현재 클래스 내에서 (-)
	private static void privateMethod() {
		System.out.println("default method");
	}
}