1. 변수(variable)
변수 : 프로그램이 실행되는 동안 어떤 값을 저장하기 위해 사용하는 공간
프로그램이 실행될 때마다 저장되어 있는 값이 바뀔 수 있다.
복수 개의 값을 저장 X 하나의 값만 가능
변수에는 다양한 타입의 값을 저장 X 한가지 타입의 값만 가능
강타입 (정적 타입) 언어 : 자바, c, cpp
약타입 (동적 타입) 언어: 파이썬, 코틀린, 자바 스크립트
1.1 변수 선언 방법
<데이터 유형> <변수 식별자 이름>;*
- 같은 타입의 변수는 콤마(,)를 사용하여 한꺼번에 선언할 수 있다. ex) int a, b, c;
- 초기값 : 변수를 선언하고 처음 저장한 값
- 변수에 초기값을 주는 행위를 '초기화'라고 부른다.
1.2 변수의 사용 범위
- 변수는 중괄호"{ }" 안에서 선언되고 사용됩니다.
- 변수는 선언된 블록 내에서만 사용이 가능합니다.
- 변수는 블록이 끝나면 메모리 스택에서 제거됩니다.
비트, 바이트
비트(bit)와 바이트(byte)는 컴퓨터에서 정보를 측정하는 단위(용량 단위)입니다.
1. 비트(bit)
용량 단위중 가장 작은 것
BInary digiT(이진 숫자)
한 칸에 1글자의 기계어를 넣을 수 있다.
기계어는 0,1 두가지이기 때문에 비트 1칸은 경우의 수가 2가지입니다.
2bit에 넣을 수 있는 조합쌍 4가지
00 01 10 11
2. 바이트(byte)

- 8개의 비트로 이루어진 정보 단위
- 문자, 숫자, 기호 등을 표현할 때 사용
프로그래밍에서 변수명이 중요한 이유
기본적으로 우리가 사용하는 프로그램 데이터는 RAM에 저장된다
킬로바이트(kilo byte)단위는 바이트가 1000개 모인 것
메가바이트(mega byte)단위는 킬로바이트가 1000개, 즉 1,000,000(백만)바이트
기가바이트(giga byte)단위는 메가바이트가 1000개, 즉 1,000,000,000(10억)바이트
→ 32gb 램을 가진 컴퓨터라면 이론상 320억개의 바이트를 가지고 있는 것
CPU : 계산
RAM : 계산을 위한 임시 저장 공간
디스크 : 저장
바이트마다 붙는 주소. 다 외울 수 있나요?
없다.
메모리주소는 랜덤하게 배정되기 때문에, 그 값을 숫자로 찾기에는 어려우니 변수를 사용하는것
1. 변수
변수는 다른 값을 할당할 수 있으므로 변수의 값은 프로그램 실행 중에 변경될 수 있다.
2. 상수
상수는 프로그래밍에서 변하지 않는 값으로, 한번 설정하면 그 값을 바꿀 수 없다.
→ 상수는 변수와 다르게 값을 변경할 수 없기 때문에 보통 프로그램에서 변하지 않아야 하는 값,
예를 들어 원주율 같은 값에 사용되기도 하고,
코드 유지보수적인 측면에서는 Magic Number를 쓰지 않기 위해서
같은 의미를 가진 값을 일괄적으로 관리하기 위해 쓰기도 한다.
2.1 상수 기초
상수는 대문자로만 작성하는 것이 관례
// c언어 or cpp
const float PI = 3.14;
// JavaScript
const PI = 3.14;
자바: final 키워드 이용
final double PI = 3.14;
파이썬:
PI = 3.14
상수는 값이 변하지 않아야 하기 때문에 보통 초기화가 반드시 필요.
유지보수적인 측면에서 상수를 쓰는 이유
특정 프로그래밍 언어가 아닌 간단한 슈도코드(논리적 흐름만 나타내는 코드)로 설명하겠습니다.
1. 코드 해석의 문제
- 매직넘버(숫자를 바로 사용하는 것)를 사용하는 경우
int memberPoint = 0;
if(구매자가 일반 상품을 구매하는 경우){
memberPoint += 20;
}else if(구매자가 이벤트 상품을 구매하는 경우){
memberPoint += 40;
}
- 매직넘버를 사용하지 않고 변수를 지정해주는 경우
const int NORMAL_ITEM_POINT = 20;
const int EVENT_ITEM_POINT = 40;
int memberPoint = 0;
if(구매자가 일반 상품을 구매하는 경우){
memberPoint += NORMAL_ITEM_POINT;
}else if(구매자가 이벤트 상품을 구매하는 경우){
memberPoint += EVENT_ITEM_POINT;
}
2. 코드 관리의 문제
- 수치가 변하는 경우
const int NORMAL_ITEM_POINT = 30;
const int EVENT_ITEM_POINT = 50;
const int EVENT_CARD_RATE = 1.5;
int memberPoint = 0;
if(구매자가 일반 상품을 구매하는 경우){
memberPoint += NORMAL_ITEM_POINT;
}else if(구매자가 이벤트 상품을 구매하는 경우){
memberPoint += EVENT_ITEM_POINT;
}else if(구매자가 이벤트 카드로 일반 상품을 구매하는 경우){
memberPoint += NORMAL_ITEM_POINT * EVENT_CARD_RATE;// 20 -> 30점에 1.5배 적립
}else if(구매자가 이벤트 카드로 이벤트 상품을 구매하는 경우){
memberPoint += EVENT_ITEM_POINT * EVENT_CARD_RATE;// 40 -> 50점에 1.5배 적립
1. 정수 표현법
정수 : 양의 정수, 음의 정수, 0
1.1 부호없는 정수의 표현법

이진수는 말 그대로 2가 될 때 마다 한 자리를 올리는 것
이진수 101 만들기
000 + 001 = 001
001 + 001 = 010 (1의자리가 1+1이라 2가 되어 한 자리 올라감)
010 + 001 = 011
011 + 001 = 100 (1+1을 하는 곳 마다 한 자리씩 올림)
100 + 001 = 101

*5번이 아니라 숫자 5n비트의 이진수로는 0부터 2^n - 1까지의 수를 표현할 수 있다.
ex. 5비트의 이진수는 2^5-1 = 31
1.2 부호있는 정수의 표현법
제일 왼쪽 비트가 0이면 양수, 1이면 음수라는 뜻.

- 연산했을 때의 유의사항

00101 : +3
10010 : -2
1이 나와야하는데 -5가 나오는 것을 볼 수 있다.
따라 가장 왼쪽 비트에 부호를 표기하는 방법은 불가능하다.
1.3 가산법을 보완하기 위한 1의 보수
보수 : 서로 더했을때 0이 나오는 수
1의 보수: 음수 표현 시, 어떤 양수 이진수의 각 자리에서 1을 0으로, 0을 1로 바꾼 것

- 1의 보수를 활용한 5+(-5) 연산

11111이 나왔으나, 보수임을 감안하고 봤을 때 -0이 나왔다는 것을 알 수 있다.
1.4 1의 보수의 문제를 해결하기 위한 2의 보수
2의 보수: 1의 보수에 1을 더한 값

- 2의 보수를 활용한 -5+5 연산

실제 비트 크기가 같아야만 프로그래밍적으로 연산이 가능하여 제일 왼쪽 1은 삭제되므로 0이 도출된다
컴퓨터는 양수를 부호와 절대값 방식으로 구해놓고
음수가 필요하다면 구해놓은 양수를 2의 보수 방식으로 변환해 처리한다
2. 정수의 범위
- 정수 (4Byte) 값의 범위

byte, short(2), int(4), long(8) 키워드(예약어)
자바에서 정수의 2진수 표현 방법은 "부호와 2의 보수" 표현방법을 사용한다
정수형은 10진수뿐만 아니라 2진수, 8진수, 16진수 등의 형태도 표현할 수 있다
정수형의 디폴트는 int이므로 long형을 지정하려면 할당할 숫자 뒤에 "L"을 붙여준다
ex. int a = 9999999L;
실수형 데이터 타입
- 실수형 변수를 선언할 때 float, double 키워드 사용
- 실수형은 디폴트형이 double이므로 float형을 지정하려면 숫자 뒤에 "F"를 붙여준다.
- 실수형 표현은 소수점 표현방식인 10진수형 표현방식과, 지수 형식으로 나타내는 과학기술용 표기법이 사용된다.
논리형 데이터 타입(boolean)
- 논리형 값에는 true와 false가 있다.
- 논리형은 다른 데이터 타입과 서로 형 변환(type casting)할 수 없다.
- 또한 C언어에서처럼 숫자 값을 논리 값으로 해석하여, 0을 false로 다루고 0이 아닌 값을 true로 해석하는 것을 허용하지 않는다.
- 논리형 데이터타입에서는 오직 true와 false만 허용한다.
문자형 데이터 타입
- 단일 문자 char형
- char형: 0~ 2^16의 범위 내에서 부호가 없는 16비트(2byte) 숫자를 사용하여 유니코드 문자 표현
- char형 값: 홑 따옴표 (' ')안에
- String: 문자열을 좀 더 쉽게 다루기 위해 만들어 놓은 클래스입니다.
- String 클래스: 문자열 표현
- 문자열 값: 겹 따옴표(" ")안에
메모리 저장형태에 대해 먼저 배워보겠습니다.
코드 해석법에 대해 배워보겠습니다.
형 변환(type casting)
- 데이터의 크기
byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
- float은 4바이트인데 long보다 큰 타입인 이유: 표현할 수 있는 값의 경우의 수가 float이 더 크다.
- 작은 데이터 타입 → 큰 데이터 타입 변환,
캐스트 연산자를 사용 X 컴파일러에 의해 자동 형 변환(Promotion)이 일어난다. - 큰 데이터 타입 → 작은 데이터 타입 변환,
반드시 캐스트 연산자를 사용O.
변환할 데이터 타입 명시(강제 형 변환: Type Casting). 그렇지 않으면 컴파일시 오류 발생 - 서로 다른 타입의 데이터의 연산을 진행할 경우, 두 데이터 중 큰 데이터 타입을 가진 쪽에 맞추어 자동 형 변환된 후 연산
- int형보다 작은 데이터타입의 연산을 진행할 경우, 자동으로 int형으로 형 변환
package day02;
public class CastingExample1 {
public static void main(String[] args) {
/*
* 크기가 작은 데이터타입의 데이터를 큰 데이터타입으로
* 변환할때는 데이터타입을 자동으로 올려서(promotion/upcasting) 처리합니다.
*/
byte b = 10;
int i = b; // byte -> int로 자동변환.
char c = '가';
int j = c; // char -> int로 자동변환
System.out.println(j);
int k = 500;
double d = k; // int -> double로 자동변환
System.out.println(d);
}
}
package day02;
public class CastingExample2 {
public static void main(String[] args) {
/*
* 크기가 큰 데이터를 작은 데이터타입으로 바꾸려면
* 반드시 캐스팅 연산자(type)을 사용하여
* 명시적으로 형 변환을 해야 합니다(downcasting)
*/
int i = 72;
char c = (char)i;// int -> char는 자동 변환이 되지 않으므로 char로 바꾼다 명시해야함
System.out.println(c);
/*
* 강제 형변환의 경우 데이터 손실이 일어날 가능성이
* 있기 때문에 자동으로 처리해주지 않습니다.
*/
double d = 4.83123;
int j = (int)d;// 변환시 소수점 아래가 소실되므로 자동변환을 허용하지 않음
System.out.println(j);
/*
* 강제 형 변환시주의점은 해당 데이터 타입이
* 처리할 수 있는 범위를 넘어선 데이터를 강제로 다운캐스팅 하면
* 오버플로가 일어납니다.
*/
// 00000000 00000000 00000100 00000000
int k = 1024;
byte b = (byte)k;// -128~+127 범위에 1024 집어넣기
System.out.println(b);
}
}
연산자(Operator)
- 연산자: 변수의 값 변경, 대입
- 자바 - 연산자에 따라 연산 대상이 될 수 있는 데이터 타입이 정해져 있다
- 오버플로(overflow) 또는 언더플로(underflow) 등 범위를 벗어나는 연산들 :
연산 결과에 불필요한 값 저장 - 0으로 나눌 경우 오류 발생
단항 연산자(Unary Operator)
- 단항 연산자: 피 연산자가 하나인 연산자
- 단항 연산자의 종류
- 증/감 연산자(++, --) : 변수 값을 하나 증가시키거나, 감소시키는
- 부호 연산자(+, -) : 양수와 음수를 나타내는
- 비트 반전 연산자(~) : 비트의 값을 바꿔주는
- 논리 반전 연산자(!) : 논리대수의 값을 반전시켜주는
- 캐스트연산자 ( (type) ) : 데이터 타입을 바꿔주는
2항 연산자(Binary Operator)
- 2항 연산자: 피 연산자(Operand)가 두 개인 연산자
- 연산자가 int형(4byte)보다 작은 크기의 데이터 타입인 경우,
boolean형을 제외하고 모두 int형으로 자동 형 변환
2항 연산자의 종류
- 산술 연산자 ( +, -, *, /, % )
- 나머지 연산 결과는 항상 정수
- 비교 연산자 ( <, <=, >, >=, ==, != )
- 조건을 만족하면 true 그렇지 않으면 false를 반환
- 비교되는 숫자의 데이터 타입이 다를 경우,
크기가 큰 데이터 타입에 맞추어 비교 연산 실행
비트 연산자 ( &, |, ^ )
- 비트 연산자 : 두 수를 각각 2진수로 변환, 두 수의 각 비트 연산 수행
a. **&** (비트곱): 두 비트가 1일 때 1, 나머지는 0.
b. **|** (비트합): 두 비트 중 하나 이상이 1이면 1, 두 비트 모두 0이면 0.
c. **^** (xor 배타적 논리합): 두 비트가 다르면 1, 같으면 0.논리 연산자 ( &, |, &&, || )
& : 양쪽 항이 모두 true일 때만 true 반환
| : 양쪽 항 중 한쪽만 true를 만족해도 true 반환
&& : 만일 왼쪽 항이 false일 경우, 오른쪽 항을 수행하지 않고 무조건 false 반환
|| : 만일 왼쪽 항이 true일 경우, 오른쪽 항을 수행하지 않고 무조건 true 반환
⇒ &&, ||을 short circuit operator라고 부릅니다.
대입 연산자(Assignment Operator)
=
+=, -=, *=, /=, %=
3항 연산자
피 연산자가 3개인 연산자
( 조건식 ? 연산식1 : 연산식2 )
: 조건식의 결과값이 참이면 연산식1, 거짓이면 연산식2를 실행하라.
조건식에는 boolean형 조건식이 들어갑니다.
★★★★★★★★계산순서★★★★★★★★
소괄호 > 단항 > 이항 > 삼항 >대입
배열(Array)
같은 데이터 유형 변수를 여러 개 선언해야 하는 불편함을 줄이기 위해 사용
자바 - 배열을 정의하는 대괄호[]가 배열 변수명 앞에 온다
배열의 구조
배열 선언: <데이터 타입><배열 이름[]> or <데이터 타입[]><배열 이름>
배열 생성: <배열 이름> = new <데이터 타입[배열의 크기]>-> new는 heap에 생성
자바의 배열은 선언 시 크기를 명시 X , 생성 시에 크기 명시
기본데이터 타입이나 객체참조 데이터 타입 또는 다른 배열의 순차적인 집합체
하나의 배열에 여러가지 데이터형 혼합해서 사용 X
이런 배열의 특징을 동종모음(Homogeneous collection)선언, 생성, 초기화의 과정으로 만들어짐
선언 시 배열에 들어갈 데이터 타입을 결정, 생성 시 만들 배열의 크기 결정.
초기화 과정을 통하여 배열에 들어갈 값 입력배열의 길이 : 배열에 저장할 수 있는 전체 항목
코드에서 배열의 길이를 얻으려면 → 배열변수이름.length
'Programing🤖 > JAVA' 카테고리의 다른 글
| [JAVA] 접근제한자와 상속 (0) | 2024.08.23 |
|---|---|
| [JAVA] 클래스와 객체지향 프로그래밍 (0) | 2024.08.23 |
| [JAVA] 함수와 메서드 (0) | 2024.08.23 |
| [JAVA] 제어 (0) | 2024.08.23 |
| [JAVA] 기본사항 이해하기 (0) | 2024.08.23 |