논리 연산자 && (AND = 피연산자 모두 참), || (OR = 피연산자 둘중 하나라도 참), ! (피연산자의 반대 boolean값)
// 논리 연산자
boolean flag1 = true;
boolean flag2 = true;
boolean flag3 = false;
System.out.println(flag1); // true
System.out.println(flag2); // true
System.out.println(flag3); // false
// 피연산자 중 하나라도 true 이면 true
System.out.println(flag1 || flag2); // true
System.out.println(flag1 || flag2 || flag3); // true
// 피연산자 모두 true 이면 true
System.out.println(flag1 && flag2); // true (flag1, flag2 모두 true 라서)
System.out.println(flag1 && flag2 && flag3); // false (flag3은 false 라서)
// And 연산
System.out.println((5 > 3) && (3 > 1)); // 5 는 3 보다 크고, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) && (3 < 1)); // 5 는 3 보다 크고, 3 은 1 보다 작다 (false)
// Or 연산
System.out.println((5 > 3) || (3 > 1)); // 5 는 3 보다 크거나, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) || (3 < 1)); // 5 는 3 보다 크거나, 3 은 1 보다 작다 (true)
System.out.println((5 < 3) || (3 < 1)); // 5 는 3 보다 작거나, 3 은 1 보다 작다 (false)
// System.out.println(1 < 3 < 5); // 불가능한 코드
// 논리 부정 연산자
System.out.println(!flag1); // false (flag1 값의 반대)
System.out.println(!flag3); // true (flag3 값의 반대)
System.out.println(!(5 == 5)); // false
System.out.println(!(5 == 3)); // true
대입 연산자 변수를 바로 연산해서 그 자리에서 저장하는 연산자 기본 대입 연산자인 =,+,- 와 다른 연산을 함께쓰는 복합 대입 연산자가 있다. (+=,-= 등) 복합 대입 연산자는 기본 대입 연산자를 심플하게 작성하게 해주는 것이지 기능은 같다. += 1 은 ++과 동일하다(피연산자에 1 더해주기) EX) num1 += num2 라고 하면 num1 = num1 + num2 가 되는 것. 똑같이 -=1은 --와 동일하다(피연산자에서 1빼주기)
🔥주의! ++ 또는 --가 피연산자 뒤에 붙이냐, 앞에 붙이냐에 따라서 연산순서가 달라진다.
연산자
연산자 위치
기능
연산 예
++
++{피연산자}
연산 전에 피연산자에 1 더해줌.
val = ++num; num값+1 후에 val변수에 저장
++
{피연산자}++
연산 후에 피연산자에 1 더해줌.
val = num++; num값을 val변수에 저장 후 num+1
- -
- -{피연산자}
연산 전에 피연산자에 1 빼줌.
val = —num; num값-1 후에 val변수에 저장
- -
{피연산자}- -
연산 후에 피연산자에 1 빼줍니다.
val = num—; num값을 val변수에 저장 후 num-1
// 대입 증감 연산자
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 10;
int val = ++a + b--; // a 는 연산전에 +1, b 는 연산후에 -1
System.out.println(a); // 11
System.out.println(b); // 9
System.out.println(val); // 21
// 11 + 9 가 왜 21??
// a 는 val 연산전에 ++ 가 수행되어서 11로 연산되었지만
// b 는 val 연산후에 -- 가 수행되어서 기존값이 10으로 연산된 후 -- 가 수행.
// 따라서 연산된 a값인 11과 연산되기전 b값인 10이 더해져서 21이 됨!
int c = a--; // c 에 a 값 대입 후 a-1 (즉, a=10, c=11)
int d = ++b; // b 값 +1 후에 d 에 대입 (즉, b=10, d=10)
int val = c-- * ++d; // c 는 연산후에 -1, d 는 연산전에 +1
System.out.println(a); // 10
System.out.println(b); // 10
System.out.println(c); // 11
System.out.println(d); // 10
System.out.println(val); // 11 * 11 = 121
// 11 * 10 이 왜 121??
// c 는 val 연산후에 -- 가 수행되어서 기존값이 11로 연산된 후 -- 가 수행되었지만
// d 는 val 연산전에 ++ 가 수행되어서 11로 연산.
// 따라서 연산전 a값인 11과 연산된 b값인 11이 곱해져서 121이 됨!
}
}
쉽게 말해,
int a = 10;
int b = 10;
int val = ++a + b--;
이 부분만 보면 나는 일단 뒤에 붙은 복합 연산자는 없다고 생각하고 본다.
그러면 val = ++a + b 이니까 a에 1을 더한 11 + 10 을 해서 val = 21이 되는 것이고 계산을 다 한 후 b에 복합연산자인 --를 붙여 b값은 9가 되는 것!
// 삼항 연산자
int x = 1;
int y = 9;
boolean b = (x == y) ? true : false;
System.out.println(b); // false
String s = (x != y) ? "정답" : "땡";
System.out.println(s); // 땡
int max = (x > y) ? x : y;
System.out.println(max); // 9
int min = (x < y) ? x : y;
System.out.println(min); // 1
⭐연산자 우선순위
산술 > 비교 > 논리 > 대입
// 연산자 우선순위
int x = 2;
int y = 9;
int z = 10;
boolean result = x < y && y < z; // <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // true
result = x + 10 < y && y < z; // +10 산술연산자 계산 후 <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // false
result = x + 2 * 3 > y; // 산술연산자 곱센 > 덧셈 순으로 계산 후 > 비교연산자 계산
System.out.println(result); // false (8>9)
result = (x + 2) * 3 > y; // 괄호안 덧셈 연산 후 괄호 밖 곱셈 계산 후 > 비교연산자 계산
System.out.println(result); // true (12>9)
int number = 10; // 1. 변수로 선언 및 초기화
number = 11; // 2. 변수의 값을 바꾼다. (덮어쓰기)
3. 상수 : 변하지 않는 저장공간
final int number = 10; // 1. 상수로 선언 (데이터 타입 앞에 final 을 붙이면 됨)
number = 11; // e2. 변수의 값을 바꾸려고 하면 에러가 남
논리형 변수 : boolean - True/False 값만 저장
boolean flag = true; // 1 논리형 변수 boolean으로 선언 및 True 값으로 초기화
flag = false; // 2. False 값으로도 저장 가능.
문자형 변수 : char - 'A','1'와 같은 문자 하나만 저장
char alphabet = 'A'; // 문자 하나를 저장
정수형 변수 : byte, short, int, long - 0,1,2,99 와 같은 정수형 숫자값을 저장 <정수형 변수 표현 범위> - byte : -128 ~ 127 - short (2byte) : -32,768 ~ 32,767 - int (4byte) : -21억 ~ 21억 - long (8byte) : 9백경 정도의 매우 큰 수
byte byteNumber = 127; // byte는 -128 ~127 범위의 숫자만 저장가능
short shortNumber = 32767; // short는 -32,768 ~ 32,767 범위의 숫자만 저장 가능
int intNumber = 2147483647; // int는 -21억 ~ 21억 범위의 숫자만 저장 가능
long longNumber = 214783647L; // long은 숫자뒤에 알파벳 L을 붙여서 표기하며 매우 큰 수 저장가능
실수형 변수 : float, double - 0.123, 0.9999와 같은 소수점 실수값을 저장 - float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼)범위의 숫자 저장이 가능 - double (8byte) : 1.7* -10^308~ 1.7 * 10^308(long 보다 큼)범위의 숫자 저장이 가능 ✋ float 가 long 보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안됨.
long longNumber = 3.14f; // long < float 자동 형변환 불가
float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값
[참조형 변수]
문자열 변수 : String - "Apple", "텍스트"와 같은 문장을 저장
String message = "Hello World"; // 문자열 저장
그 외 : Object, Array, List ,,, - 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장
List<int> alphabet = [0,1,2,3]; // 기본형 변수 여러개 저장
[래퍼 클래서 변수]
박싱 : 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것
언박싱 : 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것
// 박싱
// Integer 래퍼 클래스 num 에 21의 값을 저장
int number = 21;
Integer num = number;
// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줌.
[아스키 코드]
문자는 숫자(int)를 문자(char)로 매핑해서 표현
그 중 Java에서는 기본적으로 아스키 코드 라는 규칙으로 문자를 저장(표현)함.
아스키 코드 표
숫자 → 문자
// 숫자 -> 문자
import java.util.Scanner; // java.util이라는 놈이 제공하는 것을 쓰겠다.
// Scanner : 입력한 값을 저장하게 하는 것
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int asciNumber = sc.nextInt(); // nextInt()로 읽은 그 값을 하나하나를 아스키 넘버로 저장
char ch = (char)asciNumber; // 아스키넘버를 character로 바꾸는 작업
System.out.println(ch);
}
}
이렇게 입력하면 콘솔창에서 커서가 깜빡거리게 된다.
커서가 깜빡거리는 콘솔창콘솔창에 '97'을 입력하니 'a'라는 결과값이 나옴
콘솔창의 'a'값은 System.out.println(ch);에 의해 나온 결과값이다.
( 97이라고 입력한 것을 sc.nextInt()로 인해서 읽어줘서 asciNumber로 할당 되었다. 그 값이 (char)에 의해서 char변수 타입으로 바뀌어서 a라는 값이 나왔다(아스키표에 의함))
문자 → 숫자
// 문자 -> 숫자
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
int asciNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.
System.out.println(asciNumber);
}
}
위와 똑같이 커서가 깜빡거리는 콘솔창위와 반대로 'a'를 입력후 '97'의 결과값 도출
[형변환]
// 실수 -> 정수(0.XXXX -> 0)
double doubleNumber = 10.101010;
float floatNumber = 10.1010f;
// 변환(int)
int intNumber;
intNumber = (int)doubleNumber; // dounle -> int
System.out.printle(dounleNumber); // 변환 전
System.out.printle(intNumber); // 변환 후
- 메모리 영역(Java 데이터를 저장하는 영역) : 운영체제로부터 JVM이 할당받은 메모리 영역
- 클래스 로더(Java.class 바이트 코드를 메모리 영역에 담는 운반기) : JVM으로 class(바이트코드)를 불러와서 메모리에 저장함
- 가비지 컬렉터(Java 쓰레기 청소기) : 메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기
이번 수업에서 사용할 프로그램은IntelliJ IDEA 이다.
[코드 해석하기]
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
class Main : (.java)를 (.class)로 바꿔주기때문에 class 라고 명칭을 하고 Main 클래스 라고 한다.
public static void main(String[ ] args) 에서 형광펜 쳐진 부분을 main 메소드 라고 한다. 자바 프로젝트(앱)는 제일 먼저 클래스의 main 메소드를 실행시킨다. 모든 프로젝트는 이 main 메소드로부터 시작되어서 가지를 뻗어나가면서 프로젝트를 구동함.
static : 이 프로그램이 시작될 때 무조건 실행되는 녀석임을 표현.
public : "(접근)제어자"src폴더에 있는main class는 어디서든 접근이 가능,
✨.java의 이름과 동일하게 일치시켜줘야 한다!
<output>
void : 메서드의 출력값의 데이터 타입 "아무것도 없다." → 출력은 없다. ex) 출력이 String 으로 나와야 한다 라고 하면 public static String main(String[ ] args)~~
<input>
String[ ] args : 매개변수 자리 main 메서드를 호출할 때 input은 뭘로 할거냐, input의 타입은 뭘로 할거냐 → string 타입으로하고 변수명은 args(변수명은 아무거나 써도 노상관)이다.
<객체> : 특징(속성, 변수), 행동(메소드)
하위요소를 표현할 때 온점(.)으로 표현함
public class Main {
public static void main(String[] args) {
System.out.println("Our First Project!");
}
}
System class안에 있는 out이라는 놈 안에 있는 행동을 통해서 "Our First Project!"를 콘솔창에 프린트 한다.