상수(constant)
1. 상수(constant)란 뭘까?
상수는 "변하지 않는 수", 반드시 값이 초기화 되어야 하고 한번 초기화 되면 변경할 수 없게 하는 메모리 공간을 의미합니다. 이 특징 때문에 원주율 3.14, 1년의 12개월, 최대 사용 가능자의 수 등을 표현할 때 사용할 수 있습니다. 자바에서 상수를 선언하는 방법은 final 이라는 예약어를 사용합니다.
예시 코드
public class ConstantTest {
public static void main(String[] args) {
final int MAX_NUM = 10;
final int MIN_NUM;
MIN_NUM = 0;
System.out.println(MAX_NUM);
System.out.println(MIN_NUM);
// MAX_NUM = 100;
}
}
상수를 사용하면 "코드의 의미가 명확"해지고, 나중에 값을 변경해야 할 경우에도 쉽게 대응할 수 있습니다.
package basic.ch02;
/*
* 컴파일 시점과 --> .class 파일을 만들어 내는 과정 (javac 명령어 동작)
* 런타임 시점 --> Ctrl + F11 프로그램 실행 ~~~~~~ 실행 종료 까지
*
* JAVA 명령어는 프로그램을 실행 시키는 명령어 이다.
* javac 명령어는? 번역하는 과정이다.
*
*자바 언어로 코드를 작성하고 있어요
*JDK 도구를 설치 해야 자바 프로그래밍이 가능 -> 도구들이 존재
*JDI --> JRE(자바 프로그램 실행 환경이라고 한다.) (Java Runtime Environment)
*JRE --> JVM(자바 가상 머신) (Java Virtual Machine)
*JVM 은 .clss 파일을 실행 시켜주는 녀석이다.
*JVM 은 어떤 연산을 거쳐 이진코드(바이너리 파일로 변환 시켜서 수행하는 녀석이다)
*/
public class Constant {
// 메인 함수 - 코드의 시작점
public static void main(String[] args) {
// 상수 선언 --> 값이 한번 정해지면 변경할 수 없는 수(값, 데이터)
final int MAX_NUM = 10;
final int MIN_NUM;
MIN_NUM = 0;
// MAX_NUM = 100; // 컴파일 오류 발생한다.
// 중요 *******
// Ctrl + S 누르면 IDE 툴이 javac Constant.java 명령어를 수행한다.
// 명령어의 결과로 Constant.clss 파일이 생성 된다.
// Why? JVM 이해할 수 있는 언어이기 때문에 번역을 해주어야 한다.
System.out.println("------------------------------------------");
// 원주율 "상수"로 선언
final double PI = 3.14159;
// 원의 반지름을 "상수"로 선언 하자.
final int RADIUS = 10;
// 원의 둘레를 계산공식
System.out.println(2 * PI * RADIUS);
// 원의 면적 계산 (원 내부의 공간의 크기)
System.out.println(PI * RADIUS * RADIUS);
} // end of main
} // end of class
리터럴(literal)
원래 100, 5, 3.14, ‘T'와 같은 값들이 '상수'인데, 프로그래밍에서는 상수를 '값을 한번 저장하면 변경할 수 없는 저장공간'으로 정의하였기 때문에 이와 구분하기 위해 상수를 다른 이름으로 불러야만 했습니다. 그래서 상수 대신 리터럴이라는 용어를 사용한다. 리터럴은 단지 우리가 기존에 알고 있던 '상수'의 다른 이름일 뿐입니다.
정리
리터럴은 소스 코드 내에서 고정된 값을 직접 나타내는 데이터입니다. 예를 들어, 10, 123, 3.14, 'A'는 모두 리터럴입니다. 리터럴은 변수나 상수에 할당되는 값 자체를 표현하며, 이 값들은 프로그램 실행 중 변경될 수 없습니다.
리터럴은 상수와 비슷해 보일 수 있지만, 리터럴은 '값 자체'를 의미하고, 상수는 '값이 저장되는 변경 불가능한 메모리 공간'을 의미합니다.
상수는 값을 변경할 수 없는 변수이다. 리터럴은 고정값을 나타내는 표기법 [상수] == [리터럴] 이해 쉽게
도전 과제 1
사각형의 면적을 구하는 코드를 작성해보시오 단, 상수를 선언해서 활용하세요
package basic.ch02;
public class RectangleAreaCalculator {
public static void main(String[] args) {
// hint --> 가로 길이 , 세로 길이
// 식을 작성하고
final int WIDTH = 8;
final int HEIGHT = 9;
int area = WIDTH * HEIGHT;
// 결과 출력하기
System.out.println("사각형의 면적: "+area);
// 문자열은 특별한 녀석이다. 연산을 사용할 수 있습니다.
// 문자열 + 정수, 문자열 + 실수 .....
// 위 연산에 결과 값은 ---> 문자열 리턴 된다.
}
}
도전 과제 2
삼각형의 면적을 계산하는 코드를 작성해 보자. ( 밑변 * 높이 ) / 2
package basic.ch02;
public class TriangleAreaCalculator {
public static void main(String[] args) {
// 삼각형에 밑변 BASE, 단 상수로 선언
float Base = 10.0f;
// 삼각형의 높이 HEIGHT, 단 상수로 선언
float HEIGHT = 5.0f;
// 결과 값을 area 변수에 저장
float area = (Base * HEIGHT)/2;
System.out.println(" 삼각형의 면적 : " + area );
// String result = " 삼각형의 면적 : " + area;
// System.out.println(result);
} // end of main
} // end of class
형 변환(type casting)
형 변환이란?
형변환(type casting)은 프로그래밍에서 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 과정을 말합니다. 형변환은 크게 두 가지 유형으로 나눌 수 있습니다: 암시적 형변환과 명시적 형변환. 자동형변환, 강제형변환
(그림)

실습 코드
package basic.ch02;
public class TriangleAreaCalculator {
public static void main(String[] args) {
// 삼각형에 밑변 BASE, 단 상수로 선언
float Base = 10.0f;
// 삼각형의 높이 HEIGHT, 단 상수로 선언
float HEIGHT = 5.0f;
// 결과 값을 area 변수에 저장
float area = (Base * HEIGHT)/2;
System.out.println(" 삼각형의 면적 : " + area );
// String result = " 삼각형의 면적 : " + area;
// System.out.println(result);
} // end of main
} // end of class
도전 과제
<aside>
💡 당신은 전자 상거래 웹사이트를 운영하고 있으며, 특정 제품에 대해 할인 행사를 진행하려고 합니다. 제품의 원래 가격은 59.99달러이고, 30% 할인을 적용하려고 합니다. 최종 가격을 계산한 후, 소수점 이하를 버리고 정수 부분만을 가격으로 표시하려고 합니다.
1. 제품의 원래 가격과 할인율을 상수로 선언하십시오.
2. 할인된 가격을 계산하고, 그 결과를 정수로 형변환하여 최종 가격을 구하십시오.
3. 최종 가격을 출력하십시오.
</aside>
할인율 공식 선정하기 (인터넷 검색)
- 할인된 가격 = 원가 − (원가 × 할인율)
- 할인된 가격 = 원가 × (1 − 할인율)
공식 테스트 및 사용
원가가 50달러이고 할인율이 30%인 경우 (30% → 0.30) 할인된 가격은?
1번 공식 활용 적용
할인된 가격 —→ x
할인율은 소수점으로 변경 —→ 0.3
50 x 0.3 —> 15
즉 50달러에 할일율 30% 하면 35달러 이다.
할일율을 계산하는 공식을 선택하고 코드로 표현해 보자. - 비즈니스 로직
double discountedPrice = ORIGINAL_PRICE * (1 - DISCOUNT_RATE);
package basic.ch02;
public class DiscountCaculatory {
public static void main(String[] args) {
// 상수 선언 - 원가, 할인율
final double ORIGINAL_PRICE = 59.99;
final double DISCOUNT_RATE = 0.3;
// 할인된 가격 = 원가 * (1 - 할인율)
// 할인된 가격 계산 하기 (비지니스 로직)
double discountedPrice = ORIGINAL_PRICE * (1 - DISCOUNT_RATE);
// 최종된 가격을 정수형으로 형 변환 처리
int finalPrice = (int)discountedPrice;
// 결과 출력
System.out.println("최종 가격 : " + finalPrice);
System.out.println("최종 가격(소수점) : " + discountedPrice);
} // end of main
} // end of class
정리
(그림)

(그림)

명령어를 통한 컴파일, 실행
명령 프롬프트 이용방법
명령 프롬프트 이동방법
D 드라이브로 이동방법-> :D
상위 폴더에서 하위 폴더로 이동-> cd
bin 폴더에서 HelloWorld 파일로 이동-> cd D:\workspace\java\teco_java\bin\basic\ch01
하위 폴더에서 상위 폴더로 이동-> cd..
명령 프롬프트에서 실행해 보기
-- 컴파일 하기
1. 해당 파일이 있는 디렉토리로 이동하기
2. 소스 코드에 한글이 포함 되어 있다면 인코딩 문제로 오류 발생 가능
javac HelloWorld.java
안될 경우 : javac -encoding UTF-8 Constant.java
--> 해당 디렉토리에서 HelloWorld.class 파일이 생성 됨
-- 실행 시켜 보기
java HelloWorld
HelloWorld . java 파일 컴파일 - 오류 발생
(그림)

HelloWorld . java 파일 컴파일 - 인코딩 설정
(그림)

HelloWorld.class 파일 생성 여부 확인
프로그램 실행 시켜 보기
(그림)

도전과제
Constant.java 파일을 명령프롬프트로 컴파일 하고 실행 시켜 보세요
(그림)

확인해보기
자바 파일을 이클립스에서 컴파일 하면 프로젝트/bin 폴더에 들어가고 명령 프롬프트를 통해 명령어로 컴파일하면
그 디렉토리에서 .class 파일이 생성 됨
.class 파일이 생성되는 위치가 다른 이유는, 각 환경의 컴파일 과정과 설정이 다르기 때문입니다.
연산자(항, 대입, 부호)
항(Operands)과 연산자(Operators)
연산 과정에서 사용되는 데이터나 값을 항(Operands)이라고 합니다.
하나 이상의 항을 사용하여 특정 연산을 수행하는 기호를 연산자(Operators) 라고 합니다.
대입 연산자 (Assignment Operator) : ‘ = ‘
대입 연산자는 특정 값이나 다른 변수의 결과를 변수에 할당(대입)하는 데 사용됩니다.
대부분의 이항 연산자 중에서 실행 우선순위가 가장 낮아서, 대부분의 연산이 이루어진 후에 마지막으로 값이 할당됩니다. (연산에 순서는 오른쪽에서 왼쪽으로) 기본 형태는 왼쪽 변수 = 오른쪽 표현식(값, 변수, 또는 계산식)입니다.
부호 연산자 : ‘ +, - ‘
부호 연산자는 변수의 부호를 변경하거나 유지하는 단항 연산자입니다.
연산자는 변수의 부호를 그대로 두고, - 연산자는 변수의 부호를 반전시킵니다.
변수의 실제 값을 변경하고자 할 때는 부호 연산자와 함께 대입 연산자를 사용해야 합니다.
package basic.ch03;
/*
* 부호 연산자
* 단항 연산자 --> 변수에 부호를 변경 (리터럴값에 부호를 변경)
*/
public class Operation1 {
public static void main(String[] args) {
int intData = 1000;
System.out.println(+intData);
System.out.println(-intData);
System.out.println("-----------");
System.out.println(intData);
// 반드시 기억 -> (부호 연산자는 변수에 실제 값이 변경되는 것은 아니다)
// 메모리 공간안에 실제 값을 변경 하려면 어떻게 해야하나?
// 답은 --> 대입 연산자와 함께 사용해야 한다.
intData = -intData;
System.out.println("실제 변수안에 들어있는 값 : " + intData);
// 연습
int oneStepDistance = 1;
final int ZERO_POINT = 0; // 상수를 사용할 때는 대문자를 권장 한다.
int currentPostion = 0;
// 제로 포인트에서 왼쪽으로 3칸 이동한 값을 출력 하시오.
// 식을 작성
currentPostion = ZERO_POINT - (oneStepDistance * 3);
// 결과값 출력
System.out.println(currentPostion);
// 절대값이란?
// 절대값이란 어떤 수의 크기를 나타내는 것으로 그 수가 0에서 얼마나 떨어져
// 있는지를 표시한다.
// 즉, 어떤 수의 절대값은 그 수가 양수이든 음수이든 상관없이 항상 양수 입니다.
// 0의 절대값은 0 입니다.
//currentPostion 값이 양수 였다면 부호연산자를 통해 변경하고
// 절대값이 틀려지게 된다.
System.out.println(-currentPostion);
// 우리는 절대값을 구하는 알고리즘을 만들어야 한다.
// 자바 개발자들이 이미 만들어 둔 도구(Tool) 이다.
// 자바 개발자들이 이미 만들어 둔 도구이다.
// Math math; // 수학과 관련된 기능들에 모음,
System.out.println("Math 라이브러리 사용 : " + Math.abs(currentPostion));
} // end of main
} // end of class
연산자(산술)
산술 연산자에 대해 살펴 봅시다.
(그림)

연산자(증감, 감소)
- 단항 연산자
- 변수의 값을 오직 1 더하거나 1 뺄때 사용
- 연산자가 항의 앞에 있는가 뒤에 있는가에 따라 연산 시점과 결과가 달라짐
- 문장(statement)의 끝(;)을 기준으로 연산 시점을 생각해야 함
(그림)

package basic.ch03;
public class Operation3 {
/*
* 증감, 감소 연산자
* 변수에 접근해서 그 값을 조직 1증가 또는 1감소 시킨다.
*/
public static void main(String[] args) {
int value1 = 1;
// value1++;
++value1;
System.out.println(value1);
// 변수에 접근해서 1 감소 시키기
int value2 = 1;
value2--;
System.out.println(value2);
// 증감 연산자가 변수 뒤에 올 때 (후의 연산자)
int intData1 = 10;
int resultData;
// (오른쪽)에서(왼쪽)으로 간다.
// 후의 연산자는 ; (세미콜론 기준으로 동작 합니다)
// 11 = 10 + 1
resultData = intData1++;
System.out.println(resultData); // 결과 10
System.out.println(intData1);
// ; 세미콜론 기준으로 끝나고 변수에 접근해서 1을 증가 시켰다.
// ---> 여러분들은 전위 연산자로 사용하자
// 증감 연산자가 변수 앞에 올 경우(전위 연산자)
int intData2 = 100;
int resultData2;
resultData2 = ++intData2;
System.out.println(resultData2);
// 결론 : 증감 연산자는 변수의 값을 오직 1 증가 시킬때 사용 한다.
// 항에 앞, 뒤 위치에 따라서 연산에 순서가 다르다.
} // end of main
} // end of class
연산자(복합 대입 연산자)
- 대입 연산자와 다른 연산자가 함께 쓰임
= + , - , * , %
+=, -=, *=, %=
(그림)

복합 대입 연산자는 대입 연산자 앞에 연산자를 작성해주어야 한다.
package basic.ch03;
public class Operation4 {
/*
* 복합 대입연산자란 대입 연산자와 다른 연산자가 함께 쓰이는 것 (산술연산자)
*/
/*
* 복합 대입연산자란 대입 연산자와 다른 연산자가 함께 쓰이는 것 (산술연산자)
*/
public static void main(String[] args) {
int score = 5;
// score += 10;
// System.out.println("점수 확인 : " + score);
// 도전 연습 --> int score = score + 10;
// score 변수에 적븐해 기존에 존재하는 값에 더하기 10을 해주세요
// 15 = 5 + 10;
// score = score + 10;
score += 10;
System.out.println(score);
System.out.println("--------------------");
int n1 = 100;
// n1 이라는 변수에 접근해서 기존에 있는 값에 추가로 10을 더해주세요
// n1 = n1 + 10;
n1 += 10;
System.out.println("n1 : " + n1);
// score 변수에 접근해서 10점 감소 시켜주세요
// score = score - 10;
score -= 10;
// ! 점수 두배 증가
score *= 2;
System.out.println("score : " + score);
// ! 점수를 반으로 감소
score /= 2;
System.out.println("score : " + score);
} // end of main
} // end of class
package basic.ch03;
public class Operation4_1 {
/*
* 복합 대입연산자란 대입 연산자와 다른 연산자가 함께 쓰이는 것 (산술연산자)
*/
public static void main(String[] args) {
int num1 = 0;
num1 += 2;
System.out.println(num1); // 2
int num2 = 0;
num2 -= 2;
System.out.println(num2); // -2
int num3 = 1;
num3 *= 3;
System.out.println(num3); // 3
int num4 = 10;
num4 /= 2;
System.out.println(num4); // 5
int num5 = 5;
num5 %= 3;
System.out.println(num5); // 2
} // end of main
} // end of class
연산자(관계,논리,빠른평가,삼항)
관계(비교)연산자
- 이항 연산자
- 연산의 결과가 true(참), false(거짓)으로 반환 됨, 비교연산자 라고도 함
- 조건문, 반복문의 조건식으로 많이 사용 됨
(그림)

관계 연산자를 주어로 바라보고 하는 말이 사실인지 거짓인지 확인 하자.
package basic.ch03;
public class Operation5 {
/*
* 관계, 비교 연산자
* 연산의 결과 값이 무조건 true, false 반환 된다.
*/
public static void main(String[] args) {
int num1 = 5;
int num2 = 3;
// 관계 연산자를 주어로 바라 보자
// ex) 왼쪽의 항이 오른쪽 항보다 크다 (라고 생각하면 편하다)
boolean value = ( num1 > num2 ) ;
System.out.println(value);
System.out.println(3 < 5);
System.out.println(3 >= 10);
System.out.println(3 <= 3);
System.out.println(3 == 5);
System.out.println(3 != 5);
System.out.println("-------------------------------");
// 5 < 3
System.out.println(num1 < num2);
// 5 <= 3
System.out.println(num1 >= num2);
// 5 <= 3
System.out.println(num1 <= num2);
// 5 == 3
System.out.println(num1 == num2);
// 5 != 3
System.out.println(num1 != num2);
} // end of main
} // end of class
논리 연산자
● 관계 연산자와 혼합하여 많이 사용 됨
● 연산의 결과가 true(참), false(거짓)으로 반환 됨
(그림)

package basic.ch03;
public class Operation6 {
/*
* 논리 연산자
* 관계 연산자와 혼합하여 많이 사용 된다.
* 연산에 결과는 true, false 으로 반환 된다.
*/
public static void main(String[] args) {
// 논리 연산자는 3가지 종류가 있다.
// 논리곱 ---> && (엠퍼센트, 엠퍼센트)
// 논리합 ---> || (버티컬 바, 버티컬 바)
// 부정 ---> ! (느낌표)
int num1 = 10;
int num2 = 20;
// 1. 논리곱(&&)
// T && T
// 논리곱은 전부 true 이면 true 반환 한다. 하나라도 거짓이면 false를 반환 한다.
boolean flag1 = (num1 > 0) && (num2 > 0);
System.out.println("flag 1 : "+ flag1);
// T && F
boolean flag2 = (num1 > 0) && (num2 < 0);
System.out.println("flag 2 : "); // 결과값 : F
System.out.println("============================");
// 2. 논리 합
// T || F
// 논리 합은 둘 중에 하나라도 true 이면 연산에 결과는 무조건 true 이다.
boolean flag3 = (num1 > 0) || (num2 < 0);
System.out.println(flag3);
// 3. 부정
// flag1 은 true 였다.
// flag2 은 false 였다.
// flag3 은 true 였다.
System.out.println("부정 논리 연산자 사용 : " + !flag3);
// 연산에 결과가 어떻게 되지 ---> 확인해봐야지 ---> 로깅 한다.
System.out.println("flag3 : " + flag3);
} // end of main
} // end of class
빠른 평가(short circuit evaluation)
빠른 평가(short-circuit evaluation)는 논리 연산에서 첫 번째 조건이 결과를 결정하는 경우, 두 번째 조건을 평가하지 않는 자바의 특성입니다.
- 논리 곱(&&)은 두 항의 결과가 모두 true일 때만 결과가
true 앞의 항의 결과가 false이면 뒤 항의 결과를 평가하지 않음 - 논리 합(||)은 두 항의 결과가 모두 false일 때만 결과가 false
- 앞의 항의 결과가 true이면 뒤 항의 결과를 평가하지 않음
package basic.ch03;
public class Operation7 {
/*
* 빠른 평가란?
* 논리 연산에 있어 첫 번째 조건이 결과를 결정할 때
* 두 번째 조건을 평가 하지 않는 것을 의미한다.
*
*/
public static void main(String[] args) {
int number = 5; // 변수의 선언과 동시에 초기화
int index = 0;
// 빠른 평가가 동작하는 식을 만들어 보자.
// F
// 15 < 10
boolean result = ( (number = number + 10) < 10) && ( (index = index + 2) < 10 );
System.out.println("현재 number 변수에 값은 : " +number);
// index의 값이 0 인 이유 앞에 있는 값을 판단하고 False가 나왔기 때문에
// 굳이 뒤에있는 값 까지 계산하지 않아도 값이 나오기에 Cpu가 계산하지 않음
System.out.println("현재 index 변수에 값은 : " +index);
System.out.println("========================");
// number 값 재 설정
number = 5;
// 논리합을 이용한 빠른 평가 식을 만들어 보자.
// 15 < 10 || 2 < 10
// F || T
result = ((number = number + 10) < 10 || (index = index +2) < 10);
//문제
System.out.println("number : " + number);
System.out.println("index : " + index);
// 도전 문제 number 와 index 반대로 변경 해서 출력해 보자
boolean result2 = (( (index = index + 2) < 10 ) && (number = number + 10) < 10);
System.out.println(" 도전문제 현재 index 변수에 값은 : " +index);
result = ( ( (index = index +2) < 10) || (number = number + 10) < 10);
System.out.println(" 도전문제 현재 index 변수에 값은 : " +index);
} // end of main
} // end of class
'Java' 카테고리의 다른 글
| 2024.04.09 형 변환(type casting) (0) | 2024.04.10 |
|---|---|
| 2024.04.09 상수(constant) 리터럴(literal) (0) | 2024.04.10 |
| 2024.04.08 데이터 타입(Data Type) (0) | 2024.04.10 |
| 2024.04.08 변수(Variable) (0) | 2024.04.10 |
| 2024.04.08 Java 출력하기 (0) | 2024.04.08 |