[JAVA]_2일차

전희주·2023년 4월 6일
0

JAVA

목록 보기
2/24
post-thumbnail

지난 강의 리뷰

리뷰
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)

  • S/W
  • 주된 기능: class(byte code) 실행
  • 자체적인 메모리 포함
  • JDK(자바 개발 키트)

JVM (java virtual machine)

  • 주요 기능 : class(byte code)를 실행시킨다.
  • machine(-하드웨어너낌)이기 때문에 "자체적인 메모리"가 있다.
  • jdk 설치하면 jvm이 설치된다.
  • jre는 사용자가 쓴다(고객이 필요한 것)

JDK(java developemnt kit)

  • 개발할 때 쓰는 툴

  • jre를 이미 다 포함하고 있음

  • jvm 덕분에 java로 만든 프로그램은 운영체제에 독립적이다.

  • class file은 있다면 운영체제가 window이던가 linux이던가 어쨋던간에 그냥 다 실행 가능

(vs C언어 : os에 바로 달라붙어 있어서 운영체제 바뀌면 다시 컴파일해야함 - jvm 같은 거 없음)

  • class는 운영체제에 독립적, jvm은 의존적(OS마다 달라짐)

변수

  1. 목적: Data(PDT/RDT-클래스) 저장

  2. 사용법

    1. 변수 선언

    데이터형 변수명; ex) int n(기본형 변수); string n2; (참조형 변수: 무조건 4바이트)

    b. 변수 초기화

    → 맨 처음 값을 저장하는 동작

    : 변수명 = 값; ex) n=10;

    기본형은 초기화하면 그 자리에 값이 들어 있지만, 참조형은 그 자리에 값이 있는 게 아니라 주소가 있기 때문에 값이 들어 있는 주소를 가리킨다.

    → 데이터형 변수명 값 이렇게 한 번에 쓸 수도 있음

    1. 특징
    • 같은 블럭({}) 내에서 중복된 이름 사용 불가 ⇒ 식별 불가하기 때문
    • 변수를 블럭 안에서 선언하면 다른 데서 사용할 수 없음(선언된 블럭 안에서만 인식 가능함)
    • 블럭이 다르면 중복 사용 가능
    1. 외우기
    • 변수 종류
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 변수는 한 번만 생성되고, 가장 오래 살아 있음.

    • 변수를 오래 사용하고 싶으면 staic 변수로 선언하면 됨.
    • 따라서 어떤 데이터를 누적해 사용할 때는 주로 static 변수를 사용함.
  • instance 변수는 객체 생성시 매번 생성됨.

    • 공유하지 않고 자신만의 데이터로 사용할 때 주로 사용
    • 즉 uinque 한 값을 저장하고자 할 때 사용
    • 데이터 10개를 만들어서 모두 독립적으로 변수에 저장해야 하는 경우
  • local 변수는 메서드 호출 시 매번 생성

    • 임시 데이터를 잠깐 저장했다가, 없어지는 경우
    • 임시적인 데이터 저장 시 주로 사용
  • 로컬 변수와 인스턴스 변수는 메모리 할당 영역이 다르므로 같은 변수명을 사용할지라도 문법 오류가 발생하지 않음

  • 로컬 변수 사용 시 주의할 점: 사용하기 전 반드시 초기화 => 초기화하지 않으면 에러 발생
    cf) 인스턴스 변수와 스태틱 변수는 초기화하지않아도 자동으로 임의의 값으로 초기화

변수 생성 및 종료 순서

  • 변수 생성 순서

    • 1) 스태틱
    • 2) 인스턴스
    • 3) 로컬변수 순으로 생성
  • 변수 종료 순서

    • 1) 메서드가 가장 먼저
    • 2) 인스턴스
    • 3) 스태틱이 가장 나중에 삭제
    • => 변수를 오래 사용하고 싶으면 staic 변수로 선언하면 됨.
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); 
		 
	}

}

데이터 형 변환

ref.
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%ED%83%80%EC%9E%85-%ED%98%95%EB%B3%80%ED%99%98-%EC%A2%85%EB%A5%98-%EB%B0%A9%EB%B2%95-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC#%EA%B0%95%EC%A0%9C_%ED%98%95%EB%B3%80%ED%99%98_casting

  • 데이터 종류가 필요에 의해서 변환됨
    • 기본형 data 형 변환 가능
    • 참조형 data 형 변환 가능
      • 클래스 간의 형변환(참조형 변수끼리의 형변환)
        반드시 상속 관계에서만 가능한 변환
  • 형 변환 종류 (2)
    • 자동형 변환(promotion) (묵시적)
      : 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때만 자동 타입 변환이 발생한다.

      자동 형 변환이 가능한 방향
    • char => int 변환 가능
      • 예) int x = 'A'; (문자의 아스키 코드 값이 대입되기에)
      • 즉, char 문자를 연산할 수 있다는 의미임.
    • 작은 타입과 큰 타입이 연산하면 큰 타입으로 반환
      • 정수, 실수 연산 결과는 실수
    • 문자열 + 값 ==> 연결된 문자열로 반환
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);
		
        
       
		
		
		
	}

}
  • 강제형 변환(Casting) (명시적)
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; 
          
	}

}
	

연산자

1) 산술연산자

  • +: 산술연산자 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 (작은 타입 + 큰 타입 연산 ==> 큰 타입 자료형 반환) 
		
		// + : 산술연산 및 연결연산자로 사용된다. 

	}

}

2) 대입연산자

  • A = B;
    => B를 A에 대입
  • A += B
    => B를 A와 더해서 A에 대입
  • A -= B
    => B를 A에서 빼서 A에 대입
  • A *= B
  • A /= B
  • A %= B
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);
	
		
	}

}

3) 비교 연산자

  • (중요) 비교 연산자의 결과 값은 true, false 논리형!
  • 기준이 되는 값은 등호(=) 앞에 있는 값!

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);
		
		
	}

}

4) 논리 연산자

  • (중요) 논리 연산자의 결과 값은 true, false 논리형!
    => 비교 연산자와의 공통점
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  
	
		
	}

}

5) 증감 연산자

  • 증가 연산자
    • 전치 연산 : ++n (연산자가 변수의 앞에 붙음) // n+=1, n=n+1
    • 후치 연산 : n++ (연산자가 변수의 뒤에 붙음) // n+=1, n=n+1
  • 감소 연산자
    • 전치 연산 : --n (연산자가 변수의 앞에 붙음) // n-=1, n=n-1
    • 후치 연산 : n-- (연산자가 변수의 뒤에 붙음) // n-=1, n=n-1
  • 전치, 후치는 다른 연산자와 같이 사용시 주의!! (혼자 쓸 때는 결과 무차별)
    예)
    int x = ++n; 먼저 증가하고 나중에 할당 (증가 => 할당)
    int x2 = n++; 먼저 할당하고 나중에 증가 (할당 => 증가)

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 
		
		}

}

6) 3항 연산자

  • 조건에 따라 취할 값이 달라진다.

  • 변수 = (조건식) ? 값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); 
		
		
		}

}

7) 참조형 data

  • instanceof 연산자
  • 변수명 instanceof 클래스명
package p03;

public class 클래스타입체크 {

	public static void main(String[] args) {
		
		String name = "hello"; 
		
		// 변수명 instanceof 클래스명 
		System.out.println(name instanceof String);
		
		}

}
  • 실행 결과

문장 (statement)

  • 문장 (실행문, 비실행문)

  • 실행문(2)

    • 순차문 : 코드가 작성된 순서대로 실행되는 문장. 라인 순서대로 실행. ; 로 끝남.
    • 제어문 : 코드의 실행 흐름(순서)을 제어하는 구문.
      • 조건문(분기문)
        단일 : if문
        if~else 문
        다중 if 문
        switch 문
      • 반복문
        for문
        while문
        do while문

  • 비실행문: 주석문(3)

    • // 한줄 주석문
    • \* S *\ 여러 주석문
    • \** S *\ : API 문서 작성시 사용됨
      xxx.class => 다른 사용자가 사용하도록 배표, API 매뉴얼
      +) javadoc.exe => html로 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);
		}
	}

}

ifelse문

다중 if문

  • 순차문이므로 위에서 부터 순차적 실행
  • if 조건식이 여러개인 것
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"); 
		
		
		
	}

}

0개의 댓글