리뷰
1. 데이터 종류(Type) : 기본형(수치형, 문자형, 논리형), 참조형(클래스, 배열, 인터페이스) => 데이터 간주
2. 프로그램 언어 : sql, c, java => 단어 구성(영문자 시작, 이후 숫자 사용 가능, 한글은 가능하지만 권장 X) => 식별자
: 시스템 정의 식별자 -> 예약어, 키워드
: 사용자 정의 식별자 -> 클래스명, 변수명, 메서드명
3. javac.exe(컴파일러) : java -> class, byte code는 반드시 JVM 위에서 실행됨
java.exe(인터프리터) : class -> class 실행
4. 리터럴(값) : 1번에서 정리했던 값인데 이를 표현하는 방법
정수는 10진수, 2진수, 8진수 등 표현 가능하고 실수는 소수점, 지수 표현 가능, 문자는 ''로 표현, escape 문자, 유니코드
https://goodgid.github.io/Java-JDK-JRE/
*JVM(Java Virtual Machine)
JVM (java virtual machine)
JDK(java developemnt kit)
개발할 때 쓰는 툴
jre를 이미 다 포함하고 있음
jvm 덕분에 java로 만든 프로그램은 운영체제에 독립적이다.
class file은 있다면 운영체제가 window이던가 linux이던가 어쨋던간에 그냥 다 실행 가능
(vs C언어 : os에 바로 달라붙어 있어서 운영체제 바뀌면 다시 컴파일해야함 - jvm 같은 거 없음)
목적: Data(PDT/RDT-클래스) 저장
사용법
데이터형 변수명; ex) int n(기본형 변수); string n2; (참조형 변수: 무조건 4바이트)
b. 변수 초기화
→ 맨 처음 값을 저장하는 동작
: 변수명 = 값; ex) n=10;
기본형은 초기화하면 그 자리에 값이 들어 있지만, 참조형은 그 자리에 값이 있는 게 아니라 주소가 있기 때문에 값이 들어 있는 주소를 가리킨다.
→ 데이터형 변수명 값 이렇게 한 번에 쓸 수도 있음
package p01;
public class VariableTest {
public static void main(String[] args) {
//1. 기본형 변수
//가. 변수 선언 => 메모리에 영역 생성 작업, 영역 크기는 데이터 타입에 의존 int는 4byte, 저장되는 값은 실제 값
int n;
//나. 변수 초기화
n=10;
System.out.println(n);
//2. 참조형 변수
//가. 변수 선언 => 메모리에 영역 생성 작업, 영역 크기는 무조건 4byte, 저장되는 값은 주소 값
String name;
//나. 변수 초기화
name = "홍길동";
System.out.println(n);
}
}
package p01;
public class VariableTest2 {
public static void main(String[] args)
{
// 저장할 데이터 목록
// 홍길동 20 서울 182.23 true 남
// 메모리 영역을 할당하는 작업을 변수 선언이라고 한다
// 변수 선언, 초기화는 동시에 수행 가능
String name = "홍길동";
int age = 20;
String address = "서울";
float height = 182.23F; // 182.23f //F를 안 쓰면 double로 처리돼서 F를 붙여야 함
double weight = 74.23;
boolean isMarried = true;
char gender ='남';
System.out.println("이름: " + name);
System.out.println("나이: " + age);
System.out.println("주소: " + address);
System.out.println("키: " + height);
System.out.println("체중: " + weight);
System.out.println("결혼 여부: " + isMarried);
System.out.println("성별: " + gender);
}
}
package p01;
public class VariableTest3 {
int m = 20; //인스턴스 변수
static int m2 = 30; //static 변수, class 변수 (static 기재 안하면 class 변수)
// main 메서드
public static void main(String[] args) {
{
// 로컬변수(local variable)
int n = 10;
System.out.println(n);
}
{
String n = "hello";
System.out.println(n);
}
}
}
package p01;
public class VariableTest4 {
int m = 20; // 인스턴스 변수
static int m2 = 30; // static 변수, class 변수
int n = 30; // 인스턴스 변수
// main 메서드
public static void main(String[] args) {
// 로컬 변수 (local variable)
int n = 10;
}
}
static 변수는 한 번만 생성되고, 가장 오래 살아 있음.
instance 변수는 객체 생성시 매번 생성됨.
local 변수는 메서드 호출 시 매번 생성
로컬 변수와 인스턴스 변수는 메모리 할당 영역이 다르므로 같은 변수명을 사용할지라도 문법 오류가 발생하지 않음
로컬 변수 사용 시 주의할 점: 사용하기 전 반드시 초기화 => 초기화하지 않으면 에러 발생
cf) 인스턴스 변수와 스태틱 변수는 초기화하지않아도 자동으로 임의의 값으로 초기화
변수 생성 순서
변수 종료 순서
package p01;
public class VariableTest5 {
int m; // 인스턴스 변수
static int m2; // static 변수, class 변수
// main 메서드
public static void main(String[] args) {
// 로컬 변수 (local variable)
int n = 0;
System.out.println(n); // 초기화 안 된 변수를 사용하면 에러
// m 사용 방법 ==> 인스턴스 변수는 반드시 객체 생성 필요
VariableTest5 t = new VariableTest5();
System.out.println(t.m); // 자동 초기화된 인스턴스 변수 m
// m2 사용 방법 ==> 클래스(static)변수는 객체 생성 없이, 클래스 명으로 접근
System.out.println(VariableTest5.m2);
}
}
package p02;
public class TypeCast {
public static void main(String[] args) {
//1. 묵시적 형변환
//가. 수치형 변환
// ==> 작은타입은 큰타입으로 자동으로 형변환이 가능하다.
byte n = 10;
short n2 = n; // short = byte
int n3 = n2; // int = short
long n4 = n3; // long = int
float n5 = n4; // float = int
double n6 = n5; // double = float
//역
//byte m = n3; // byte = int 반대의 경우 에러남
// 나. char -> int 형변환
int x = 'A';
int x2 = 'a';
System.out.println(x+ "\t"+ x2);
System.out.println('A'+1); // 65 + 1 = 66
// int보다 작은 타입의 연산 결과는 int로 반환
short c = 10;
short c2 = 20;
// short c3 = c + c2; 에러 발생
// int c3 = c + c2;
//라. 작은 타입과 큰 타입이 연산하면 큰 타입으로 반환
// 정수, 실수 연산 결과는 실수
int y = 10;
float y2 = 3.14F;
float y3 = y + y2;
// int y3 = y + y2; 에러 발생
// 문자열과 문자열이 아닌 임의의 값을 연산 => 문자열 반환 (산술 연산이 아닌, 문자열 연결)
// 문자열 + 값 ==> 연결된 문자열로 반환
String k = 1+2+3+"hello";
String k2 = "Hello" + 1+2+3;
System.out.println(k);
System.out.println(k2);
System.out.println(10 + "\t" + 20);
}
}
package p02;
public class TypeCast {
public static void main(String[] args) {
//2. 명시적 형변환 : 데이터 손실이 발생할 수 있음
/*
* 형변환 연산자 : (타입)
*
* 변수 = (타입) 값;
*
*
* */
int n = 10;
//short n2 = n; // short = int
short n2 = (short) n; // int ==> short로 변환됨
// 예>
// 다. int보다 작은 타입의 연산 결과는 int로 반환
short c = 10;
short c2 = 20;
//short c3 = (c+c2);
short c3 = (short) (c+c2);
// 굉장히 큰 정수값을 long 타입에 저장하기 위해서는 마지막에 L을 지정한다.
long x = 8902021234125L;
}
}
+
: 산술연산자 or 연결연산자 -
: 뺄셈 *
: 곱/
: 몫%
: 나머지package p03;
public class 산술연산자 {
public static void main(String[] args) {
int n = 10;
int n2 = 3;
System.out.println(n+n2);
System.out.println(n-n2);
System.out.println(n*n2);
System.out.println(n/n2); // 몫
System.out.println(n%n2); // 나머지
// 질문
System.out.println(n/3.0); // 3.33333 (작은 타입 + 큰 타입 연산 ==> 큰 타입 자료형 반환)
// + : 산술연산 및 연결연산자로 사용된다.
}
}
package p03;
public class 대입연산자 {
public static void main(String[] args) {
int n = 10;
int n2 = 3;
n+=n2; // n= n+n2
System.out.println(n+" " +n2);
n-=n2; // n= n-n2
System.out.println(n+" " +n2);
n*=n2; // n= n*n2
System.out.println(n+" " +n2);
n/=n2; // n= n/n2
System.out.println(n+" " +n2);
n%=n2; // n= n%n2
System.out.println(n+" " +n2);
}
}
package p03;
public class 비교연산자 {
public static void main(String[] args) {
int n = 10;
int n2 = 3;
// 비교연산자의 실행 결과는 논리값 (true/false)
System.out.println(n==n2);
System.out.println(n>n2);
System.out.println(n>=n2);
System.out.println(n<n2);
System.out.println(n<=n2);
System.out.println(n!=n2);
// 필요시 연산 결과를 변수에 저장한다.
boolean result = (n==n2);
System.out.println(result);
}
}
package p03;
public class 논리연산자 {
public static void main(String[] args) {
int n = 10;
int n2 = 3;
// 비교연산자의 실행 결과는 논리값 (true/false)
System.out.println(n>n2&&n<n2); // false
System.out.println(n>n2||n<n2); // true
System.out.println(!(n>n2)); // false
System.out.println(!(n>n2)||!(n<n2)); // true
System.out.println(!(n>n2)&&!(n<n2)); // false
// 1. && : and 연산자 ( 그리고 )
System.out.println(true&&true);//true
System.out.println(true&&false);//false
System.out.println(false&&true);//false
System.out.println(false&&false);//false
// +) 실행하지 않는 변수, 사용하지 않는 변수 ==> 이클립스에서 노란색으로 경고
// 앞의 값이 false이면 뒤는 실행하지 않음
//2. || : or 연산자 ( 또는 )
System.out.println(true||true);//true
System.out.println(true||false);//true
System.out.println(false||true);//true
System.out.println(false||false);//false
// 3. ! : not 연산자 (부정 연산자)
System.out.println(!true); //false
System.out.println(!false); //true
// 문제 num 값이 15보다 크고 num2 값이 30보다 작냐?
//int n = 10;
//int n2 = 3;
/*
* 자바에서는 같은 이름을 가진 변수를 중복 선언할 수 없기 때문에 컴파일 에러가 발생합니다.
* 이를 해결하기 위해서는 int n과 int n2 중 하나를 삭제하거나,
* 다른 이름으로 변경해야 합니다.
* */
System.out.println((n > 15) && (n2 <30)); // false
// 문제 num 값이 15보다 크거나 num2 값이 30보다 작냐?
System.out.println((n > 15) || (n2 <30)); // true
}
}
package p03;
public class 증감연산자 {
public static void main(String[] args) {
int n = 10;
// n++; 후치
// ++n; 전치
System.out.println(n);
// 다른 연산자와 같이 사용시 주의
int m = 10;
// int m2 = ++m; 먼저 증가하고 나중에 할당한다. 11 11
int m2 = m++; // 먼저 할당하고 나중에 증가한다. 10 11
System.out.println(m2+ " "+m); // 10 11
}
}
조건에 따라 취할 값이 달라진다.
변수 = (조건식) ? 값1: 값2
(조건식) ==> 논리값 (비교연산자 or 논리연산자)
true => 값 1
false => 값 2
3항 연산자는 중첩 사용 가능 (조건식이 여러 개 들어갈 수 있음)
package p03;
public class 삼항연산자 {
public static void main(String[] args) {
int n = 10;
// 조건 n이 20보다 크면 100 반환하고, 작으면 200 반환
int result = (n>20)?100:200;
System.out.println(result);
// 조건: n이 60보다 크면 '장년' 아니면 (40보다 크면 '중년' 아니면 '청년') 반환
String result2 = (n>60)?"장년":((n>40)?"중년":"청년");
System.out.println(result2);
}
}
instanceof
연산자 package p03;
public class 클래스타입체크 {
public static void main(String[] args) {
String name = "hello";
// 변수명 instanceof 클래스명
System.out.println(name instanceof String);
}
}
문장 (실행문, 비실행문)
실행문(2)
;
로 끝남.비실행문: 주석문(3)
//
한줄 주석문\* S *\
여러 주석문 \** S *\
: API 문서 작성시 사용됨단일 if문
: 주어진 조건을 만족하는 경우에만 특정 문장을 수행하도록 하는 제어문
package p04;
public class 단일if {
public static void main(String[] args) {
// 단일 if문
// 제어문에서 중괄호 사용은 필수가 아님, 하지만 조건 영역을 묶어서 지정해줄 수 있다.
System.out.println("1");
if(false)
{
System.out.println("2");
System.out.println("3");
}
System.out.println("end");
}
}
package p04;
import java.util.Scanner;
public class 단일if2 {
public static void main(String[] args) {
// 단일 if 문 : 조건이 true인 경우에만 실행, 블럭은 옵션, 블럭이 없으면 바로 뒤 문장 하나만 영향을 받음
// 블럭을 이용해서 그룹핑 가능
// 블럭 지정을 권장한다. (가독성)
// 키보드로 값을 입력받기 : Scanner 클래스
// System.out 표준출력이고 모니터 의미
Scanner scan = new Scanner(System.in); // System.in은 표준입력이고 키보드 의미
System.out.println("나이 입력 : ");
// 숫자 입력
int n = scan.nextInt();
System.out.println("입력한 나이 : " + n);
System.out.println("이름 입력 : ");
// 문자로 입력
String n2 = scan.next(); // hello world 입력하면 hello 반환
//String n3 = scan.nextLine(); // hello world 입력하면 hello world 반환
System.out.println("입력한 이름 : " + n2);
System.out.println("주소 입력 : ");
// 주소입력 : 서울시 강남구 방배동
//System.out.println(scan.nextLine()); // 라인으로 읽을 때
System.out.println(scan.next()); // 토큰으로 읽을 때
System.out.println(scan.next());
System.out.println(scan.next());
int num = 10;
// num 값이 짝수이면 출력하고 홀수면 출력 안함.
if (num % 2 == 0) {
System.out.println(num);
}
}
}
package p04;
import java.util.Scanner;
public class 다중if문 {
public static void main(String[] args) {
/*
* 문제:
* 키보드로 점수를 입력받아 해당되는 학점을 출력하시오
*
* 90_100: A학점
* 80~89: B학점
* 70~79: C학점
* 나머지: F학점
* */
Scanner scan = new Scanner(System.in); // System.in은 표준입력이고 키보드 의미
System.out.println("점수 입력 : ");
/*
* int num = scan.nextInt(); if(90<=num && num<=100)
*
* System.out.println("A");
*
* else if(80<=num && num<=89)
*
* System.out.println("B");
*
* else if(70<=num && num<=79)
*
* System.out.println("C");
*
* else
*
* System.out.println("F");
*/
int num = scan.nextInt();
if(num >= 90)
System.out.println("A");
else if(num >= 80)
System.out.println("B");
else if(num >= 70)
System.out.println("C");
else
System.out.println("F");
}
}