본문 바로가기

java study

#2 변수(variable) 란?

※ 시작하기 앞서  java study 카테고리 자료는 YOUTUBE에 남궁성 강사님의 자바의정석 영상을 가지고
    공부한 내용을 정리한 것이며 상업적 목적은 전혀 없음을 알립니다.

 

 

변수(variable) 란

하나의 값을 저장할 수 있는 메모리 공간

 

메모리(RAM)에 있는 공간의 주소인 메모리 주소에 이름을 줘서 다루는 게 변수이다.

 

변수는 단 하나의 값만 저장할수 있기 때문에 기존에 있던 값에 새로운 값을 저장하면 기존에 있던 값은 사라진다.

 

변수의 선언 

변수의 선언 이유 

-값(data)을 저장할 공간을 마련하기 위해서 

 

변수의 선언방법 

변수타입 변수이름

ex) int age ;              // 정수 (int) 타입의 변수 age를 선언

변수에 값 저장하기

int age;                    // 정수(int)타입의 변수 age를 선언

age = 25;                 // 변수 age에 25를 저장

 

변수의 초기화 - 변수에 처음으로 값을 저장하는 것

 

int x = 0;                  //변수 x를 선언 후, 0으로 초기화

int y = 5;                  //변수 y를 선언 후, 5로 초기화

int x = 0, y = 5;         // 위의 두 줄을 한 줄로 바꿈

 

변수는 클래스 변수, 인스턴스 변수, 지역변수가 있다.

변수의 값 읽어오기

변수의 값이 필요한 곳에 변수의 이름을 적는다.

 

int year = 0, age = 14;        // 변수에 값을 저장하여 변수를 초기화해준다.

    year = age + 2000;         // 변수의 값이 필요한곳에 변수이름을 적어준다.

    year = 14   + 2000;

    year = 2014;

변수의 타입

 

변수의 타입은 저장할 값의 타입에 의해 결정된다.

 

값의 타입

변수, 상수 ,리터럴

변수 (variable) - 하나의 값을 저장하기 위한 공간

상수 (constant) - 한 번만 값을 저장 가능한 변수

리터럴 (liteeral) - 그 자체로 값을 의미하는 것

int score = 100;
    score = 200;
final int MAX = 100;  // MAX는 상수 이기에 한 번만 값을 저장할수 있다.
		  MAX = 200;  // 한번만 저장할수 있기에 ERROR가 뜬다.
          
char ch - 'A';       // 이문장에 변수는 ch 리터럴은 'A'이다
final String str = 'abc';  //이문자에 상수는 str 리터럴은 'abc이다'

 

리터럴의 접두사와 접미사

문자열 = " " 큰 따옴표를 붙인다.

문자형 = ' ' 작은따옴표를 붙인다. 개행 문자(\n) 줄 바꿈 문자라 고도한다.

             tap이나 backspace에도 역 슬래쉬(\)를 달아줘야 한다.

실수형 = f (float), d(double) 있으며 d는 생략 허용

정수형 = L(long) , int 타입이 있으며 L은 숫자 1 하고 혼동하기 쉽기 때문에 대문자 L로 쓰는 게 좋다.

논리형 = false, true 란 리터럴을 가진다.

boolean power = true;
char ch = 'A';
String str = "ABC";

byte b = 127; // int 타입
byte b = 128; // error 

int i = 100;      //10진수
int oct = 0100;	  //8 진수
int hex = 0x100;  //16진수

long I = 10_000_000_000L; // int 타입의 최대값이 20억정도니 20억이 넘는건 long 타입에 넣는다. 
                          // int타입을 넘으니 L이 생략 불가능, 숫자 사이의 밑줄은 JDK 1.7부터 도입
                          // 100억같이 큰숫자를 알아보기 쉽게 하려 사용한다.
long I = 100; // 생략가능 

float f = 3.14f;  // 생략 불가 
double d = 3.14d; // 생략 가능

10. == 10.0
.10 == 0.10
10f == 10.0f
le3 == 1000.0d

 

변수와 리터럴의 타입 불일치

 

범위가 '변수 > 리터럴'인 경우, OK

int i = 'A';      // int > char
long I = 123;     // long > int
double d = 3.14f; // double > float

int i = 30_000_000_000; // int의 범위 (±20억) 벗어나서 error가 뜬다 "변수 < 리터럴"
long I - 3.14f;  // long < float
float f = 3.14;  // float < double

byte, short 변수에 int 리터럴 저장 가능

byte, short 타입은 리터럴이 없다 그러니 int 타입으로 저장한다.

byte b = 100;  // byte의 범위 (-128 ~ 127) 에 속함
byte b = 129;  // 타입의 범위를 넘으면 error가 난다.

 

문자, 문자열 리터럴 문자열 결합

 

char ch = 'A';
char ch = 'AB';       // error 작은 따음표 안에 두개 이상의 문자를 묶을수 없다
String s  = "ABC";    // 큰 따음표 안에 연속된 여러 문자가 있는걸 문자열

String s1 = "AB";    //String은 자바에서 제공하는 클래스 
String s2 = new String("AB"); // 본래 이렇게 써야하는데 자주쓰여 생략된거
String S1 = "A" + "B";   // "AB"

String S2 = "" + 7   // "" + "7" -> "7" 문자열에 숫자를 결합하면 숫자는 문자열이 된다.
char ch = '';  // error

 

두 변수의 값 교환하기

int x = 10, y = 20 ;
int tmp; // 빈 컵

tmp = x;    // x의 값을 tmp에 저장
x = y;      // x의 값을 y에 저장
y = tmp;    // tmp의 값을 y에 저장

 

기본형과 참조형

 

기본형 (Primitive type)

-오직 8개 (boolean, char, byte, short, int, long, float, double)

-기본형은 실제 값을 저장한다.

 

참조형 (Reference type)

-기본형 8개를 제외한 나머지가 참 조형이다.(String, System 등)

-참조형은 메모리 주소를 저장한다 (4 byte 또는 8 byte)

 참조형은 기본형과 달리 변수의 크기가  32bit JVM에선 4 byte이고 표현할 수 있는 최댓값은 대략 40억 정도이다

                                                     64bit JVM에선 8 byte이고 표현할 수 있는 최댓값은 대략 40X40 억 정도이다

Date today; // 참조형 변수 today를 선언
today = new Date(); // today에 객체의 주소를 저장 (객체생성)

 

기본형 (Primitive type) - 종류와 크기

 

논리형 - true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다.

문자형 - 문자를 저장하는 데 사용되며, 변수 당 하나의 문자만을 저장할 수 있다.

정수형 - 정수 값을 저장하는데 사용된다. 주로 사용하는 것은 int와 long(아주 큰 정수를 다룰 때 사용)이며

           byte는 이진 데이터를 다루는 데 사용되며 

           short은 c 언어와의 호환을 위해 추가되었다.

           정수형의 default타입은 int다 

실수형 - 실수 값을 저장하는 데 사용된다. float와 double이 있다.

           실수형의 default타입은 double이다

 

 

표현 가능 범위

 

 

bit와 컴퓨터 2진수 표현 원리

https://www.joongang.co.kr/article/22841133#home

 

2진수만 아는 컴퓨터 … 1+2를 (01) (000) (10)형태로 인식

컴퓨터가 10진수를 계산하고 인공지능 컴퓨터가 한국어를 알아듣는 것처럼 하지만, 사실은 모두 2진수로 바꾸어서 인식한다. 첫째, 선의 연결 상태를 숫자로 나타내고 둘째, 모든 숫자를 2진수로

www.joongang.co.kr

형식화된 출력 - printf()

 

println()의 단점 - 출력 형식 지정 불가

실수의 자릿수 조절 불가 

 

10 진수로만 출력된다. 

System.out.println(0x1 A); // 26  (10진수로 출력)

 

printf()로 출력 형식 지정가능

 

System.out.printf("%2f", 10.0/3); //3.33 %2f를 통해 소수점 둘째자리까지 출력하라고 표현할수 있다.
System.out.printf("%d", 0x1A); //26 %d는 정수 10진수로 출력하라
System.out.printf("%x", 0x1A); //1A %x는 16진수로 출력하라는 뜻

printf() 지시자

   

 

System.out.printf("[%5d]%n", 10);     //[   10]정수 5자리에 10을 의미한다
System.out.printf("[%-5d]%n", 10);    //왼쪽정렬
System.out.printf("[%05d]%n", 10);    //[00010]정수 5자리에 빈자리에 0을 채운다.

System.out.printf("d=%14.10f%n", d);  //전체 14자리 중 소수점 아래 10자리 빈자리는 0으로 채운다.

System.out.printf("[%s]%n", url);     //[www.google.com]
System.out.printf("[%16s]%n", url);   //[  www.google.com] 
System.out.printf("[%,8s]%n", url);   //[www.goog]

 

 

 

포맷 스트링 공격(알아두면 좋을 거 같은 정보) http://wiki.hash.kr/index.php/%ED%8F%AC%EB%A7%B7%EC%8A%A4%ED%8A%B8%EB%A7%81_%EA%B3%B5%EA%B2%A9#cite_note-fs-3

 

포맷스트링 공격 - 해시넷

포맷스트링 공격(Format String Attack)이란 포맷스트링과 이것을 사용하는 printf() 함수의 취약점을 이용하여 RET의 위치에 셸 코드의 주소를 읽어 셸을 획득하는 해킹 공격이다. 기존에 널리 사용되던

wiki.hash.kr

 

▶참고자료  https://youtu.be/oJlCC1DutbA

'java study' 카테고리의 다른 글

#6 연산자  (0) 2022.05.26
#5 타입간의 변환방법  (0) 2022.05.26
#4 정수형의 오버플로우  (0) 2022.05.26
# 3 화면에서 입력 받기 -Scanner  (0) 2022.05.24
#1 JAVA란  (0) 2022.05.23