변수

kxsxh·2024년 1월 19일
0

JAVA

목록 보기
7/16

변수

값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름이다 프로그램은 변수를 통해 메모리의 특정 번지에 값을 저장하고 읽을 수 있다

메모리에 값을 저장하고 싶다면 변수를 선언하고 변수에 값을 지정하면 된다
그러면 메모리의 어디에 저장하고 어떤 방식으로 저장할지는 프로그래밍 언어와 운영체제가 정한다

  • 자바의 변수는 다양한 타입의 값을 저장할 수 없다. 하나의 변수에 동시에 두가지 값을 저장할 수 없고 하나의 값만 저장할 수 있다

변수 선언

변수에 어떤 타입(type)의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정한다

타입(type)형, 자료형으로도 불린다

int age;		// 정수(int)를 저장할 수 있는 age 변수 선언
double value;	// 실수(double)를 저장할 수 있는 value 변수 선언


* int, double -> 타입, age, value -> 변수이름

타입은 변수에 저장되는 값의 종류와 범위를 결정짓는 요소이기 때문에 충분히 생각한 다음 결정해야합니다. 같은 타입의 변수는 콤마(,)를 이용해서 한꺼번에 선언할 수도 있습니다

int x;
int y;
int z;
<-> 동일
int x,y,z

예약어 : 이미 해당 프로그래밍 언어에서 의미를 갖고 사용되고 있는 단어로, 변수 이름으로 사용할 수 없습니다. 예약어로 변수 이름을 선언하면 컴파일 에러가 발생한다


값 저장

변수에 값을 저장할 때에는 대입 연산자(=)를 사용한다
오른쪽의 값을 왼쪽으 ㅣ변수에 저장한다는 의미를 갖는다

int 타입으로 score 변수를 선언하고 90이라는 정수값을 score변수에 저장한다

int score;	//변수 선언
score = 90;	// 값 저장

자바에서는 변수에 값이 저장되지 않으면 변수가 생성되지 않는다
변수에 최초로 값이 저장될 때 변수가 생성된다 이것을 변수 초기화라고 한다
이 때 사용된 값을 초기값이라고 한다
위 코드에서는 90이 초기값에 해당한다

초기값은 다음과 같이 변수를 선언함과 동시에 제공할 수도 있다

int score = 90;
변수가 초기화되면 메모리 번지 정보를 갖게 되고, 해당 메모리 번지에 값이 저장된다
초기화되지 않은 변수는 아직 메모리 번자 정보를 가지고 있지 않으므로 변수를 통해 메모리 값을 읽을 수 없다

변수 사용 범위

자바의 모든 변수는 중괄호 {} 블록 내에서 선언되고 사용된다
메소드 블록 내에서 선언된 변수를 로컬변수(local variable)라고 부른다
로컬 변수는 메소드 블록 내부에서만 사용되고 메소드 실행이 끝나면 메모리에서 자동으로 없어진다

main() 메소드 블록 내에서 변수가 선언된 모습
	public class VariableExample{ // 클래스 블록
    public static void main(String[] args){ // 메소드 블록
    	int value = 10;				// 로컬변수 value
        int sum = value+20;			// 로컬변수 sum
        System.out.println(sum);

VariableExample, main


  • 메소드 블록 내에는 다른 중괄호 {} 블록들이 작성될 수 있다
    예를 들어 조건문에 해당하는 if(){},
    반복문에 해당하는 for(){}, while(){}등이 중괄호 블록을 가질 수 있다
    이러한 중괄호 {} 블록 내에서 선언된 변수는 해당 중괄호 {} 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다

public static void main(String[] args) { //메소드 블록
	int var1; // 메소드 선언
    if (...) {	// if 블록
    	int var2;	//if 블록에서 선언
     }
     for (...){ //for 블록
     int var3; // for 블록에서 선언
     // var1과 var3 사용가능
     // var2는 사용 못함
     }
     // var1 사용가능
     // var2와 var3는 사용못함

-- 변수를 선언할 때 주의사항 --

  • 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다
  • 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에 선언한다
  • 특정 블록 내부에서만 사용된다면 해당 블록 내에 선언한다

메모리 참조 변수

프로그래밍에서 특정 메모리 위치를 가리키는 변수를 말한다
이 변수는 해당 메모리 위치에 저장된 값을 읽거나 쓸 수 있다
일반적으로 포인터 또는 참조 변수라고 불린다 

=== 변수의 명명규칙 ===

1. 변수명의 길이에는 제한이 없다.
 
2. 대,소문자 구분이 있다.
 
3. 첫글자는 숫자는 안된다. 
 
4. 특수문자는 '_' 와 '$' 만 사용이 가능하다.
 
5. 예약어(예 package, import, public, class, String, int, float ...)는 변수명으로 사용불가하다. 
 
6. <권장사항이지 규칙은 아니다> 첫글자는 소문자로 시작하고, 단어와 단어가 결합된 경우이라면 두번째 단어부터 대문자로 시작하는 카멜기법을 사용하든지 또는 단어와 단어 사이에 _ 를 넣어주는 스네이크법을 사용한다.

멤버변수와 local(지역) 변수의 차이점

  • 멤버 변수는 클래스 또는 객체에 속하며, 객체 생성 시 초기화되며 객체의 생명 주기 동안 존재합니다.
    지역 변수는 특정 블록 내에서만 유효하며, 해당 블록 실행이 끝나면 소멸되며 명시적 초기화가 필요합니다.

class

프로그램을 만들 때 필요한 부품

메소드
클래스 내에서 어떤 작업을 수행하는 코드 블록, 객체 지향 프로그래밍의 기본 구성 요소 중 하나

필드
객체나 구조체 안에 있는 변수, 이 변수들은 해당 객체나 구조체의 특징이나 속성을 나타내며, 종종 클래스 내의 멤버 변수로 사용된다

  • static 변수는 잘 안쓰임


빨간줄이 안나오게 하려면

public class Main_01 {
	// instance 변수
암기 ⭐	
	String id;  //문자열 타입
	String pwd; 
	String name;
	String email;
	int age; // int는 정수 타입
    double height; // double은 실수타입
	char grade ; // char는 문자형 타입
    ````

설계 부품들..

instance를 만들어야 함

String : 문자열을 듯하는 클래스이다
String id; : id라는 변수(변하는 수)에는 문자열이 들어온다

new Main_01();


-> 객체 인스턴스
인스턴스를 만들고 객체를 만든 다음 필드명을 만든다.

// instance 메소드
	void info_print() {
		System.out.println("=== 회원정보 ===\r\n"
				+ "		 1. 아이디 : "  + id + "\n"
				+ "		 2. 비밀번호 : " + pwd + "\n"
				+ "		 3. 성명 : " + name + "\n");
		
	}
ma1.info_print();


null -> 값이 없다

[⭐]

  • 멤버변수( instance 변수와 static 변수를 합친 것)는
    즉, instance 변수와 static 변수는 초기화를 하지 않더라도 자동적으로 초기화가 된다

 정수형인 데이터타입(byte, short, int, long)은 자동적으로 0으로 초기화가 되고, 
 실수형인 데이터타입(float, double)은 자동적으로 0.0 으로 초기화가 된다
 문자형인 데이터타입(char)는 자동적으로 ' '으로 초기화가 되고, 
 ![](https://velog.velcdn.com/images/lily_99/post/7bff75d2-01d1-445f-a067-9c2137aa8bb6/image.png)

String을 포함한 클래스 타입은 자동적으로 null로 초기화가 된다


[⭐]
초기화 : 변수에 어떤 값을 부여하는 것을 초기화라고 부른다


string address = null; 
  • 초기화가 되어진 것
    반드시 초기화를 해줘야한다

지역변수 (local variable)는 반드시 초기화 (== 변수에 어떤 값을 부여하는 것을 초기화라고 부른다)를 꼭 해주어야한다.!!!!

지역변수는 { } 내에서만 사용되는 것으로 { } 을 벗어나는 순간 지역변수는 자동적으로 메모리(RAM)에서 삭제가 되어진다
문자열과 문자열 사이의 +는 문자열 결합을 뜻하는 것이고,

숫자와 숫자 사이의 +는 더하기(PLUS)를 뜻하는 것이고,
문자열과 숫자 사이의 +는 문자열 결합을 뜻하는 것이다


추상화 : 필요한 속성 및 기능만 뽑아 내는 것


instance(인스턴스)변수

instance : 클래스의 정의를 통해 만들어진 객체를 의미
instance(인스턴스)변수를 다른말로 non static 변수라고도 한다.
instance(인스턴스)는 클래스가 메모리(RAM)에 올라가서 실제 사용가능한 객체로 되어진 상태를 말하는 것이다.
instance(인스턴스)변수는 서로 다른 instance 끼리 공유하지 못하고 각자 자기의 instance 내에서만 사용하는 것이다.

static(스태틱)변수

static(스태틱)변수는 동일한 클래스로 생성되어진 서로 다른 instance끼리 공유되어진다


생성자(constructor)

 Member() { // 생성자임
    	System.out.println(">>> Member 클래스의 생성자 호출함 <<< \n");
    }
    // 회원의 정보를 출력해주는 기능을 만들어 보겠습니다.
    void print_info() { // 인스턴스 method(메소드)이다.
  	  // void는 return 값이 없다라는 타입이다.
  	  
  	  System.out.println("=== 회원정보 === \n" 
  	+ " 1. 아이디 :" + id + "\n"
  	+ "2. 비밀번호 :" + pwd + "\n" 
  	+ "3. 성명 : " + name + "\n"
  	+ "4. 이메일 :" + email + "\n"
  	+ "5. 주소 :" + address + "\n");
  	// \n은 줄바꿈을 말한다
  	//  문자열 사이의 +는 문자열 결합을 뜻한다
	    }

System.in.read()

키코드를 읽기 위해서는 system.in의 read()를 이용하면 된다



읽은 키코드를 변수에 저장	입력장치에서
------					--
int keyCode = System. + in. + read();
				----			----
         시스템이 가지고 있는		입력된 키코드를 읽어라

System.in.read()로 읽은 키코드를 대입 연산자(=)를 사용해서 int 변수에 저장
변수에 저장된 값을 조사하면 입력된 키가 무엇인지 알 수 있다

*System.in.read()의 단점은 키코드를 하나씩 읽기 때문에 2개 이상의 키가 조합된 한글을 읽을 수 없다
키보드로부터 입력된 내용을 통문자열로 읽지 못한다
이러한 단점을 보안하기 위해서는 Scanner 클래스를 제공한다

예외처리

예외가 발생했을 때 어떻게 처리할 것인지를 말함

throws Exception

단순히 모니터에 예외 내용을 출력만 한다

Scanner 클래스

scanner : System.in.read()는 키코드를 하나씩 읽기 때문에 2개 이상의 키가 조합된 한글을 읽을 수 없다
키보드로부터 입력된 내용을 통 문자열로 읽기 위해서 Scanner를 사용할 수 있다

	
Scanner scanner = new Scanner(System.in);

Scanner scanner : Scanner 타입의 변수 scanner를 선언
new Scanner(System.in) : 시스템의 입력 장치로부터 읽는 Scanner를 생성하는 코드
생성된 Scanner는 scanner 변수에 저장했다가 언제든지 키보드에서 읽고 싶을 때 scanner.nextLine() 메소드를 실행하면 된다
scanner.nextLine() 메소드는

  • enter 키가 입력되기 전까지 대기 상태가 되며, enter키가 입력되면 입력된 모든 내용을 문자열로 읽는다
  • 키보드로부터 입력받은 문장을 읽어들이는 것인데, 엔터(종결신호)까지 모두 읽어들인 후 스캐너 버퍼에 아무것도 남기지 않는다
  • sc. nextLine();
    버퍼에 남아있는 것이 없다 , 스캐너(sc) 버퍼에 남아있는 것을 비우는(제거하는) 효과를 가진다.
    nextLine() 메서드는 항상 문자열을 반환합니다.

import java util.Scanner -> import문이라고 함
: Scanner가 java.util 패키지에 있다는 것을 컴파일러에게 알려주는 역할을 한다
->이 코드가 생략되면 Scanner를 찾을 수 없다는 컴파일러 에러(Scanner cannot be resovled to a type)가 발생

String inputStr = sc.nextLine(); 
 - string 타입의 문장을 연결시켜주겠다
System.out.println("입력한 문장 => " + inputStr);
	
// 저장된 것을 출력해보라

 int inputNum = sc.nextInt(); // return 타입이 int, 정수(int)를 읽어들이는 것
 종결자가 공백 또는 엔터이다 종결자(공백 또는 엔터) 앞가지의 입력해준 실수를 읽어온다
 
 byte inputNum1 = sc.nextByte();
 
 short inputNum2 = sc.nextShort();
 
 long inputNum4 = sc.nextLong(); 
 
  sc.nextInt();를 사용하면 스캐너(sc) 버퍼에는 종결자(공백 또는 엔터)가 삭제되는 것이 아니라 그대로 남아 있게 된다.
  
sc.nextDouble();를 사용하면 스캐너(sc) 버퍼에는 종결자(공백 또는 엔터)가 삭제되는 것이 아니라 그대로 남아 있게 된다.

String input_word = sc.next();

sc.next(); : 단어를 읽어들이는 것

  • 종결자가 공백 또는 엔터이다
    종결자(공백 또는 엔터) 앞까지 입력해준 실수를 읽어온다

sc.nextDouble(); 를 사용하면 스캐너(sc) 버퍼에는 종결자(공백 또는 엔터)가 삭제되는 것이 아니라 그대로 남아있게 된다

0개의 댓글