public class Hello { // **클래스**; public 선언하면 다른 클래스에서 접근 가능
public static int sum(int n, int m){ // **메소드**: 클래스 내부에 정의된 함수
return n+m;
} //-> Java는 클래스 밖에 함수를 정의하지 못함
public static void main(Stirng[] args){ // main 메소드에서 실행 시작
// ->String[] args로 실행 인자를 전달 받음
int i = 20;
int s;
char a;
s=sum(i,10);
a-'?'
//표준 출력 스트림 System.out의 println() 메소드 호출
System.out.println(a);
System.out.println("Hello);
System.out.println(s);
}
}
*true, false, null*
은 식별자로 사용불가primitive type 8개
Reference type <- All of not primitive type
- 배열에 대한 레퍼런스
클래스에 대한 레퍼런스
인터페이스에 대한 레퍼런스
원시타입과 레퍼런스 타입은 문법이 다르게 동작함
-> 분류 기준이 됨
문자열이 섞인 연산 -> 문자열 연결
ex) String toolName="JDE"
toolName + 1.8 -> "JDE1.8"
"("+3+","+5+")" → “(3,5)”
주의! 3+5+”:” → ”8:” / “2+5는 “+2+5 → “2+5는 25” / “2+5는 “ +(2+5) →”2+5는 7”
주의! arr[i][j]+’\t’ → 탭의 unicode 값을 더해주게 됨. 문자열만 된다는 것!!
+의 우선순위는 왼쪽에서 오른쪽인데, 문자열을 +와 함께 만나기 전까지는 일반임
반대로 문자열과 +를 먼저 만난다면 괄호 없이는 연산이 되지 않고 문자열로써 기능한다. 괄호를 쳐주어서 먼저 계산하도록 한다.
주의! 그냥 float f = 3.14; (오류발생)→ float f = 3.14f;
0.123 = .123
문자리터럴
단일 인용부호로 문자표현 or
\u다음에 4자리 16진수 숫자로 유니코드 표현or
특수문자 리터럴은 백슬래시로 시작
숫자에 '_'허용하여서 가독성을 높임
맨앞맨뒤 . L 0x앞뒤에는 올수 없음
var 키워드: 변수타입선언을 생략하여 컴파일러가 타입추론
상수선언
java에서의 변수는 초기화하지 않고 사용하면 컴파일에러
변수, 리터럴, 상수 활용 예시
public class CircleArea {
public static void main(Stirng[] args) {
final double PI = 3.14;
double radius = 10.0;
double circleArea = radius*radius*PI;
System.out.println("원의 면적 = " + circleArea);
}
}
public class TypeConversion {
public static void main(String[] args){
byte b = 127;
int i = 100;
System.out.println(b+i);
System.out.println(char(0x12340041));
System.out.println((byte(b+i));
System.out.println((int)2.9+1.8);
System.out.println((int)(2.9+1.8));
System.out.println((int)2.9+(int)1.8); //->2, ->1
}
}
import java.util.Scanner; //import문 필요
...
Scanner a = new Scanner(System.in); // Scanner 객체 생성
Scanner에서 키 입력 받기
- Scanner는 입력되는 키 값을 공백으로 구분되는 아이템 단위로 읽음
- 주의! 공백 문자: ‘\t’, ‘\f’, ‘\r’, ‘ ‘, ‘\n’
- 개발자가 원하는 다양한 타입이 값으로 바꾸어 읽을 수 있음
Scanner sc = new Scanner(System.in);
//ㄴ Scanner는 키 입력을 공백으로 구분된 토큰 단위로 끊어 읽는다.
// 사용자의 키 입력 예시: Kim Seoul 20 65.1 true
String name = sc.next(); //"Kim"
String city = sc.next(); //"Seoul"
int age = sc.nextInt(); //20
double weight = sc.nextDouble(); //65.1
boolean single = scanner.nextBoolean(); //true
import java.util.Scanner; //full name으로 꼭 써주기
public class ScannerEx {
public static void main(String args[]) {
System.out.println("이름, 도시, 나이, 체중, 독신 여부를 빈칸으로 분리하여 입력하세요");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
System.out.print("이름은" + name + ", ");
String city = scanner.next();
System.out.print("도시는" + city + ", ");
int age = scanner.nextInt();
System.out.print("나이는" + age + "살, ");
double city = scanner.nextDouble();
System.out.print("도시는" + weight + ", ");
boolean single = scanner.nextBoolean();
System.out.println("독신 여부는" + single + "입니다.");
scanner.close();
while(scanner.hasNext()){ …scanner.next~(); …}
식으로 사용해준다.++(postfix), —(postfix)
+(부호), -(부호), ++(prefix), —(prefix), ~, !
형변환
*, /, %
+(덧셈), -(뺄셈)
>>, <<, >>>
<>, <=, >=, instanceof
==, ≠
& (비트 AND)
^ (비트 XOR / 논리 XOR)
| (비트 OR)
&& (논리 AND )
|| (논리 OR)
? : (조건) ← 주의! 삼항 조건문의 조건은 괄호로 표시하기
=, +=, -=, *=, %=, &=, ^=, |=, <<=, >>=, >>>=
왼쪽에서 오른쪽으로 처리 (단항연산자, 형변환, 대입연산자 제외)
ex) int x=2, y=10, z=0;
z=x++2 + --y - 5 + x(y%2); // z는 11이다
postfix, prefix ++, --먼저 연산하고 *, /, %를 연산하고 그 후에 +, -를 계산한다.
주의! x++의 값은 연산하고 나중에 계산해도 2로 평가됨, 그 이후의 x값이 3으로 평가
+, -, *, /, % 산술 연산 예시
import java.util.Scanner;
public class ArithmeticOperator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int time = scanner.nextInt();
int second = time % 60;
int minute = (time/60) % 60;
int hour = (time/60) / 60;
System.out.print(time + "초는 ");
System.out.print(hour + "시간, ");
System.out.print(minute + "분, ");
System.out.print(second + "초 입니다 ");
출력 결과:
정수를 입력하세요: 5000
5000초는 1시간, 23분, 20초입니다.
대입 연산자(= ..등)와 증감 연산자(++, --) 사용 예시
public class AssignmentIncDecOperator {
public static void main(String[] args) {
int a=3, b=3, c=3;
//대입 연산자 사례
a += 3;
b *= 3;
c %= 2;
System.out.println("a= "+a+", b="+b+", c="+c);
int d=3;
//증감 연산자 사례
a = d++;//a=3,d=4
System.out.println("a= "+a+", d="+d);
a=++d;//a=5,d=5
System.out.println("a= "+a+", b="+b+", c="+c);
a=d--;//a=5,d=4
System.out.println("a= "+a+", b="+b+", c="+c);
a=--d;//a=3,d=3
System.out.println("a= "+a+", b="+b+", c="+c);
}
}
출력 결과:
a=6, b=9, c=1
a=3, d=4
a=5, d=5
a=5, d=4
a=3, d=3
주의! 문자열은 비교연산자 대신 a와 b문자열을 비교한다면, a.equals(b)함수를 사용해야한다. 문자열의 ==연산자는 레퍼런스 값을 비교한다.
그러나 문자열 리터럴은 같은 값이면 같은 레퍼런스 값을 같기에 ==가 맞아보일 때도 있지만 사실은 같은 레퍼런스를 가르킨다는 것을 알려줄 뿐이다.
비교 연산자(< ..등)와 논리 연산자(&& ..등) 사용 예시
public class LogicalOperator {
public static void main (String[] args) {
//비교연산
System.out.println('a' > 'b');
System.out.println(3 >= 2);
System.out.println(-1 < 0);
System.out.println(3.45 <= 2);
System.out.println(3 == 2);
System.out.println(3 != 2);
System.out.println(!(3 != 2));
//비교 연산과 논리 연산 복합
System.out.println((3>2) && (3>4));
System.out.println((3 != 2) || (-1 > 0));
System.out.println((3 != 2) ^ (-1 > 0));
}
}
출력 결과:
false
true
ture
false
false
true
false
false
true
true
조건 연산 예시
- 주의! 조건 연산에서 값을 저장하는 문장은 넣어줄 수 없다
- 대입연산 이외의 논리식, 계산식 등의 식은 넣어줄 수 있음
public class TernaryOperator {
public static void main (String[] args) {
int a = 3, b = 5;
System.out.println("두 수의 차는 " + ((a>b)?(a-b):(b-a)));
}
}
출력결과:
두 수의 차는 2
주의! 위의 형태처럼 문자열과 +연산을 하여서 출력하기 위해서는 조건 연산형태에 괄호를 쳐주어야한다. 그렇지 않으면 컴파일 오류가 발생한다
비트 논리 연산
비트 시프트 연산
시프트 연산자의 사례
주의! byte의 예외적 형변환 허용
자동형변환: 작은 size가 자동으로 큰 size가 되는 것
literal int는 원칙적으로 byte로 자동형변환이 되지 않음
그러나 byte안에 정상적으로 저장되는 값까지 허용해줌
ㄴ강제 형변환을 해준 것과 같은 원리
비트단위로 0111 1111까지만 허용 → 127까지 허용
byte a=5;
(O): compiler는 5를 int로 평가 → 원래는 에러가 나야하는데 값으로만 평가해서 허용해줌byte a=127;
(O): 127까지 허용해줌byte a=1+1;
(O): 계산을 하고 나도 여전히 int literalbyte a=0xff;
(X): 0111 1111까지만 허용해줌int b=5; byte a=b;
(X): 변수가 오면 compiler 입장에서 값을 알 수 없기에 int취급하여서 허용되지 않음비트 논리 연산과 비트 시프트 연산 사용 예시
public class BitOperator {
public static void main(String[] args) {
short a = (short)0x55ff;
short b = (short)0x00ff;
//비트 논리 연산
System.out.println("[비트 연산 결과]");
System.out.printf("%04x\n", (short)(a & b));
System.out.printf("%04x\n", (short)(a | b));
System.out.printf("%04x\n", (short)(a ^ b));
System.out.printf("%04x\n", (short)(~a));
byte c = 20; //0x14
byte d = -8; //0xf8
System.out.println("[시프트 연산 결과]");
System.out.println(c << 2);
System.out.println(c >> 2);
System.out.println(d >> 2);
System.out.printf("%x\n", (d>>>2));
}
}
연산 결과:
[비트 연산 결과]
00ff
55ff
5500
aa00
[시프트 연산 결과]
80
5
-2
3ffffffe
Compiler가 식을 평가하고 하나의 Type 통일하여서 평가함
Compiler → 우선순위 정하기 → 데이터 타입 확인 → 암묵적 형변환
import java.util.Scanner;
public class SuccessOrFail {
public static void main(String[] args) {
Scanener scanner = new Scanner(System.in);
System.out.print("점수를 입력하시오: ");
int score = scanner.nextInt();
if(score >= 80)
System.out.println("축하합니다! 합격입니다.");
scanner.close();
}
}
if는 가장 가까운 else구문과 짝을 이룬다.
ex) if(~)
if(~~)
else(~~)
주의! 두번째줄 if와 세번째 줄 else가 짝을 이룸
ex) if(~){
if(~~)
}
else(~)
첫번째줄 if와 4번째 줄 else가 짝을 이룸
import java.util.Scanner;
public class MultipleOfThree {
public static void main (String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("수를 입력하시오: ");
int number = in.nextInt();
if(number % 3 == 0)
System.out.println("3의 배수입니다.");
else
System.out.println("3의 배수가 아닙니다.");
scanner.close();
}
}
출력 결과:
수를 입력하시오: 129
3의 배수입니다.
import java.util.Scanner;
public class Grading {
public static void main(String[] args) {
char grade;
Scanner scanner = new Scanner(System.in);
System.out.print("점수를 입력하세요(0~100): ");
int score = scanner.nextInt(); //점수 읽기
if(score >= 90)
grade = 'A';
else if(score >= 80)
grade = 'B';
else if(score >= 70)
grade = 'C';
else if(score >= 60)
grade = 'D';
else
grade = 'F';
System.out.println("학점은 "+grade+"입니다.");
scanner.close();
}
}
import java.util.Scanner;
public class Nestedlf {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("점수를 입력하세요(0~100): ");
int score = scanner.nextInt();
System.out.print("학년을 입력하세요(1~4): ");
int year = scanner.nextInt();
if(score >= 60) {
if(year != 4)
System.out.println("합격!");
else if(score >= 70)
System.out.println("합격!");
else
System.out.println("불합격!");
}
else
System.out.println("불합격!");
scanner.close();
}
}
import java.util.Scanner;
public class GradingSwitch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char grade;
System.out.print("점수를 입력하세요(0~100): ");
int score = scanner.nextInt();
switch (score/10) {
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
default:
grade = 'F';
}
System.out.println("학점은 " + grade + "입니다.");
scanner.close();
}
}
주의! case문의 값
- 문자, 정수, 문자열 리터럴만 허용
- 실수 리터럴은 허용되지 않음
import java.util.Scanner;
public class CoffeePrice {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("무슨 커피 드릴까요? ");
String order = scanner.next();
int price=0;
switch (order) {
case "에스프레소":
case "카푸치노":
case "카페라떼":
price = 3500;
break;
case "아메리카노":
price = 2000;
break;
default:
System.out.println("메뉴에 없습니다!");
}
if(price != 0)
System.out.print(order + "는 " + price + "원입니다");
scanner.close();
}
}
출력 결과:
무슨 커피 드릴까요? 에스프레소
에스프레소는 3500원입니다
https://believed-poinsettia-f0f.notion.site/3-6258a40eb499419892b4bc7e96d1a8f9?pvs=4