오늘 수업 내용
01. 연산자 (분류, 종류)
02. 변수와 자료형, 연산자
03. 상수 (final)
+) error, 매개변수, String
01. 연산자 (Operator)
:단항, 이항, 삼항(조건),
대입, 복합 대입, 관계, 논리, 산술, 부호, 증감, 비트 , 비트 시프트
① 항의 수로 구분 : 단항 , 이항 (기본) , 삼항(조건 연산자)
② 대입 연산자(=): 우에서 좌로 결합. 이 때 우항의 데이터는
사라지지 않는다. 그대로 존재하는 값을 참조해서 좌항에 대입된다.
int num = 7; // 8바이트 사용. (num , 7)
// 대입한다고 7이 사라지는 게 아님.
int num2,num3; // 8바이트 사용(num2, num3)
③ 복합(대입) 연산자: += , -=, *= ,/=
이항 연산자에서 피연사자의 값이 변하지 않는 것과 다르게 , 수행이 끝나면 값이 바뀐다.
a += 10 // "a를 10만큼 증가."
// (a = a+10 풀어서 생각하면 오래걸림)
a %= b
// a를 b로 나눈 나머지값을 a에 대입.
④ 산술 연산자: + - * / %
피연산자 개수로 분류하면 이항 연산자.
나누기 연산자,나머지 연산자는 둘 중 하나라도 실수 타입이면 실수를 기반으로 계산.
⑤ 관계 연산자: >, <, >=, <=, == , !=
연산 결과로 항상 true/false를 반환
⑥ 논리 연산자: &&, ||
&& : 논리and, 그리고 (~이면서)
|| : 논리or , 또는 (~ 이거나)
! : not, 논리 부정 (ex. !참 == 거짓, !거짓 == 참)
참고) SCE _ (최단거리 연산) Short Circuit Evaluation.
:비교할 때 앞에서 결과가 나오면 뒤는 계산하지 않는다.
(ex. &&에서 앞이 false거나 ||에서 앞이 true면 계산 x)
단항 연산자에 속하는 부호, 증감 연산자.
⑦ 부호(+ , -)
: 단항 연산자로서 -는 부호를 바꾼다. +는 하는 일이 없다.
⑧ 증감 연산자 (++, --)
: 1만큼 증가, 감소한다.
: Prefix(앞): 앞에 붙음. 지금 당장 증가시킴 . (++a)
: Postfix(뒤) : 뒤에 붙음. 연산이 끝난 후 다음에 다시 마추쳤을 때 증가. (a++)
⑩ 비트(단위) 연산자 ( &, | , ~, ^ )
피연산자가 비트. 연산 처리 속도가 빠름.
조급하게 외울 건 없지만, 사용할 수 있는 상황이면 최대한 적용하면서 연습해보기.
~ (틸드) : bit not. (==논리연산자의 !)
~11001100 == 00110011
^ : (배타적 논리합)(XOR) (Exclusive or)
⑪ 비트 시프트 연산자 ( << , >>, >>> )
비트열을 이동시키는 연산자.
연산자 중 가장 빠른 비트 연산자, 그 중에서도 가장 빠른 비트 시프트 연산자.
3개짜리가 우측. (주의).
* >> : 양수일때는 >>>와 동일하지만,
음수일때는 이동하고 앞을 채울때 0이 아니라 1로 채운다.
b << 3 // b의 비트열을 왼쪽으로 3칸 이동(bit shift)
b >> 3 // b의 비트열을 오른쪽으로 3칸 이동
b >>> 3 // b의 비트열을 오른쪽으로 3칸 이동
02. 변수, 자료형, 연산자
변수 선언과 초기화에서는
: 무조건 우항을 먼저 인식(컴퓨터뿐 아니라 개발자도.)
덧셈 연산자
: 피 연산자 중 하나라도 문자열 타입이면 산술 연산이 아닌, 문자열 결합 연산 수행.
실수형 데이터 타입
: 피 연산자 중 실수형은 정수 형태와 만났을 때 , 정수를 실수로 자동 형 변환한다.
실습003
public class Test003 {
public static void main(String[] args){
System.out.println( "테스트");//테스트
System.out.println(" 테스트"); // 테스트
System.out.println(1 + 2); //산술 연산자 //3
System.out.println(1 + "2"); // 문자열 결합 연산자 //12
System.out.println("1" + "2"); // 문자열 결합 연산자 //12
System.out.println(5.0 + 10); // 15.0 (자동 형변환)
}
}
- 스코프 영역 내에서 변수명은 식별자로, 이미 선언된 변수를 재선언 할 수 없다.
- 변수명에 사용 가능한 특수문자 $, _은 팀 작업에서 특정한 목적이 있을 때 사용한다.
- 0으로 시작할 가능성이 있다면, 숫자 타입이 아니라 문자열 타입에 담아야 값 손실을 방지할 수 있다.
실습004
public class Test004{
public static void main(String[] args){
double height = 156.1; // 8바이트 실수형
int age = 28; // 4바이트 정수형
char degree = 'A'; // 2바이트 문자형
String name = "우주";
// short age; 컴파일 에러(지역 내에서 이미 선언됨)
String $name = "바다"; // $ 와 _ 는 사용 가능한 특수문자로, 문법적 오류는 없지만
//팀 작업에서 중요한 의미를 가지므로 목적없는 사용은 권장하지 않음.
// int tel = 01012345678; // 0으로 시작할 가능성이 있다면 숫자형이 아니라
String _tel = "01087654321"; // 문자열 타입에 담아야한다.
String 주소 = "은하"; // 문법 오류는 아니지만 실무에서 사용 안 함.
}
printf() : print의 확장 기능으로, 개행이 없다. printf()에서는 \n을 %n으로도 표현할 수 있다.
%형식 지정자에 c,d,f 등을 붙여 서식을 지정한다.
실습005
public class Test005{
public static void main(String[] args){
int a = 10 , b = 5; //같은 자료형은 ,로 구분해서 병렬 입력 가능.
/*====== printf() , format() (* jdk 1.5 이후 지원)
첫 번째 인자는 문자열 형태로, 출력 포맷을 지정한다.*/
System.out.printf("%d + %d = %d\n", 10, 20, 30); // 10 + 20 = 30
System.out.printf("%d + %d = %d%n", 10, 20, 30); // 10 + 20 = 30
System.out.printf("%d 과 %d\n", 10, 20); // 10 과 20
// System.out.printf("%d 과 %d\n", 10, 3.14); (런타임 에러)
System.out.printf("%d 과 %f\n", 10, 3.14); // 10 과 3.140000
System.out.printf("%d 과 %.2f\n", 10, 3.14); // 10 과 3.14
System.out.printf("%f %n", 3.141592); // 3.141592
System.out.printf("%.4f %n", 3.141592); // 3.1416 (반올림 발생)
}
}
명시적 형 변환, 접두사(8,16진수 )
실습006
public class Test006{
public static void main(String[] args){
int a = 10, b = 20;
/*(컴파일 에러) 오버플로우(2바이트에 4바이트 int 담을 수 없음)
short c = a;
error: incompatible types: possible lossy conversion from int to short*/
//명시적(강제) 형 변환
short c = (short)a;
System.out.println("c의 결과: " + c); // c의 결과: 10
int e = 030;
// 접두사가 0이면 8진수로 인식.(8의 자리 x 3 = 24)
System.out.println("e의 결과: " + e); // e의 결과: 24
int f = 0xa6;
// 접두사 0x 는 16진수 (hex) ( (16의 자리 x 10) + 6)
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
System.out.println("f의 결과: " + f); // f의 결과: 166
float g = 0; // int가 float로 자동 형 변환 후 대입 ( O )
//float h = 0.0; // double은 float로 자동 형 변환 불가( X ) 컴파일 에러
float h = 0.0f; // 명시적 형 변환으로 대입.
System.out.println("g의 결과: " + g); // g의 결과: 0.0
System.out.println("h의 결과: " + h); // h의 결과: 0.0
}
}
자료형 실습:
boolean, char, double
실습 007, 008, 009
public class Test007{
public static void main(String[] args){
boolean a = true;
boolean b ;
int c = 10, d = 5; //===> 여기까지 총 19바이트 할당
b = 200 > c; // true
b = c < d; // false
}
}
public class Test008{
public static void main(String[] args){
char a = 'a'
int a = (int)a;
System.out.println("a: "+ a);
// a: 65 (좌측 클립텍스트 메뉴에서 아스키 확인 가능)
}
}
public class Test009{
public static void main(String[] args){
double a = 1 / 2;
System.out.println("double a: " + a); // double a: 0.0
// 나눗셈의 피 연산자가 정수면 몫만 취한다.
// int 기반 연산 후 double에 대입 -
double b = (double)1 / 2; // 1을 double로 바꾼 후(1.0), 2로 나눈다.
double c = (double)(1 / 2); // 괄호는 우선순위가 높음.
System.out.println("double b: " + b); // double b: 0.5
System.out.println("double c: " + c); // double c: 0.0
double d = 1/2 + 1/2;
System.out.println("double d: " + d); // double d: 0.0
}
}
03. 상수 (final)
final 키워드는 다양한 곳에 사용할 수 있는데 변수 선언 시, 자료형 앞에 붙이면 상수로 만들어준다.
상수의 변수명은 모두 대문자로 작성하며, 여러 단어라면 _로 구분한다 ( PEN_COLOR)
실습 010, 011
// 원의 넓이와 둘레를 구하는 프로그램
public class Test010{
public static void main(String[] args){
/*---------/ 내 풀이 /--------*/
int r = 10;
double pi = 3.141592;
double width = pi * (r*r);
double length = pi * (2*r);
System.out.println("width: " + width );
System.out.println("length: "+ length);
/*--------/ 강사님 풀이 /--------*/
// 변수
int r = 10;
final double PI = 3.141592;
double area, length ;
// 연산
area = r * r * PI;
length = r * 2 * PI;
// 결과
System.out.printf("넓이: %.3f%n", area);
System.out.printf("둘레: %f\n", length);
}
}
/* 직사각형의 넓이와 둘레를 구하는 프로그램 .
------------------------------------------------*/
public class Test011{
public static void main(String[] args){
//변수
int h = 10;
int v = 20;
int width, length;
//연산
width = h * v;
length = (h + v) * 2;
//결과
System.out.println("넓이: " + width);
System.out.println("둘레: " + length);
}
}
+) error, 매개변수, String
[ 오류. error ]
오류 메세지를 100% 신뢰하면 안 된다.
어떤 부분이 오류라고 나와도 , 오히려 그 부분에는 문제가 없고
그 주변 다른 곳에서 영향을 받았을 수 있음.
따라서 단어를 번역해가면서 꼼꼼하게 볼 필요는 아직 없음.
하다보면 다양한 에러 타입 포맷에 익숙해짐.
컴파일 에러, 런타임 에러 : javac 단계와 exe 단계의 에러를 구분.
[ 매개변수 (인수, 인자, 파라미터) ]
함수에 쓰기 위해 넘겨주는 변수.
in -------> [ f(x) ] ------> out
매개변수 함수 결과
[ String ]
* String 은 객체다. 왜 기본형 타입이 아닐까?
1. 실수(float,double) 와 마찬가지로 무한대 길이로 인한 약속의 어려움.
2. 고정 길이가 아니므로 필요 메모리를 예상할 수 없다.
* 다른 기본형 타입처럼 선언, 선언과 초기화 가능.
체크 포인트:
삼항연산자 == 조건연산자, 비트, 비트 시프트 연산자.
오늘 느낀 점 :
연산자에 대해 개략적으로 알고 있었는데
꼼꼼하게 이론 확인 후 실습으로 더 익숙해질 수 있었다.
변수 선언, 처리, 결과출력 순서로 프로그램을 처음 만들었다.
단계별로 설계하니 재밌고 가독성이 좋다.
'정리 노트 > 쌍용 KDT_(자바 Spring)' 카테고리의 다른 글
23.02.02(목): 기본 입출력, 연산자(비트,논리,삼항...), 특수 문자 영문 이름 (2) | 2023.02.13 |
---|---|
23.02.01(수): BufferedReader, read(), skip(), 이름 표기법 (0) | 2023.02.12 |
23.01.30(월): 음의 2진수, 실수/정수 자료형, 가비지 컬렉터 , 자동 형 변환 (0) | 2023.02.07 |
23.01.27(금): 자바 기본 프로그래밍, 에디트 플러스, 주석, 예약어. (0) | 2023.02.05 |
23.01.26(목): 오전 추천 루틴, 메모장 코딩, .class , JVM (0) | 2023.02.02 |