JAVA runnable_file

Java 실행파일 생성, 사용

자바 실행파일 생성 & 사용

  • 프로젝트 우클릭 → export → 검색 : runnable

Untitled

  • 다음 그림에서 Runnable Jar file 클릭

Untitled

  • 해당 경로로 가서 Shift + 우클릭 → 현재 위치에서 powerShell 열기

ls명령어로 파일 확인

  • 다음과 같이 Main 을 지정해준다.
  • Browse → 원하는 경로 설정 → 파일 저장

Untitled

  • Browse → 원하는 경로 설정 → 파일 저장
  • 이름 지정하고 파일 저장

Untitled

  • 파일 탐색기에서 해당 경로로 이동
  • 공백에서 Shift + 우클릭 → 여기에 PowerShell 창 열기

Untitled

  • java -jar + ‘찾을 파일 앞글자’ + Tab
  • Enter → 자바 파일 실행
  • 정삭적으로 실행되었다.

Untitled

JAVA exception

학습목표

(클래스, 인스턴스, 오버로드, 함수정의, 함수호출, 데이터타입)

  • 에러 : 개발자가 처리할 수 없는 심각한 영역의 문제. 반드시 프로그램이 종료되는 문제

    • 문법에러 : 컴파일 전에 걸러지는 에러
  • 예외 : 개발자가 프로그램을 죽이지 않고 대처할 수 있는 문제

    • 런탄임에 발생 : 컴파일은 통과했으나 실제로 실행하면 발생하는 에러
    • 모든 예외는 자바의 Exception 이라는 클래스를 상속받는다

    예) Nullpointer, OutOfIndex, Arithmetic, ClassNotFound

예외

  • 에러보다는 덜 치명적인 비정상 상황
  • 모든 예외클래스 는 java.lang.Exception 클래스를 상속받는다
  • 예외처리를 하게되면 프로그램이 종료되지 않고 계속 정상상태를 유지할 수 있다
    < 예외처리 하는 법>
  • 간단 : try, catch, finally 문법
  • 구체적 :
1
2
3
4
5
6
7
try{
예외가 발생할 가능성이 있는 코드
}catch(예외클래스 변수명){
처리할 내용
}finally{
예외가 있든 없든 처리할 내용
}
  • 예제 코드

  • catch 문법 사용한 함수

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void printOneElement(int index) {
    // 예외처리하고 정상범위 알려주기
    try {
    System.out.println(arr[index]);
    } catch (Exception e){
    e.printStackTrace(); // 어떤 예외가 발생했는지 로그를 출력

    System.out.println("해당위치는 범위를 넘어섰습니다. "+arr.length+"까지 허용범위입니다.");
    } finally {
    System.out.println("finally 실행");
    }

    System.out.println("printOneElement 끝");
    }
  • 사용 결과

  • 에러가 있음에도 이후의 코드가 실행되었다

Untitled

인터페이스

  • 구현체 implements 인터페이스.

  • 부품들의 결합 방식에 대한 “”약속””. 다형성을 구현하는 매우 중요한 역할.

  • 인터페이스 끼리는 다중상속이 가능하다.

    • 함수의 이름, 파라미터 타입, 파라미터 개수, 리턴타입만 약속
    • 추상클래스는 변수도 있었고, 본문이 있는 함수도 있었고, 추상 함수도 있었다.
  • 추가 정보

    • 박철수 implements 의사

      • 철수는 의사의 역할을 해야되기 때문에 의사면 반드시 구현해야될 행동들을 의무적으로 구현하는 용도
    • interface 의사

      • 수술하다
      • 진료하다
      • 처방하다
    • 박철수 extends 사람

      • 철수가 가지고있는 속성과 행동의 대부분이 사람에 의해 구형되어있기 때문에 상속받는 용도
    • 추상클래스는 ‘존재’의 개념으로 상위개념을 뽑는 개념

    • 인터페이스는 ‘기능’의 강제화의 개념

      • 반드시 이 이름으로, 이 파라미터로, 이 리턴타입으로 함수를 재정의 해야한다는 약속

추상클래스 vs 인터페이스

  • 공통점 : 둘 다 추상메소드를 오버라이팅 해야한다
  • 외우는 것이 아니지만 진짜 이해가 안돼서 외우도록 가이드를 주자면 같은 코드를 반복해야돼서 부모의 것을 물려받아서 중복을 막는다면 추상클래스
    • 반드시 구현해야 하는 기능의 약속이면 인터페이스
    • be(존재)로 구분되면 추상클래스
    • do(하는일)로 구분되면 인터페이스

패키지

  • 패키지는 논리적 주소
  • 폴더는 물리적 주소
  • 실제로 서로 다른 폴더에 있더라도 패키지가 같으면 프로그램은 같은곳에 있다고 인식한다. 물리적 폴더가 없더라도 논리적으로 같은 곳에 있다고 인식한다.
    • 예) a폴더 밑의 b폴더밑의 c폴더에서 import kr.co.human.클래스1
      x폴더 밑의 y폴더밑의 z폴더에서 import kr.co.human.클래스1
      같은 위치의 클래스를 가져올수 있다.
    • 예2)import kr.co.human.클래스2
      import com.google.클래스2
      클래스 이름이 같지만 오류 없이 실행된다
  • 목적 : 같은 이름의 변수를 쓸 수 있게 하기 위함
    • 같은 이름의 변수를 서로 다른 클래스에서 쓸 수 있듯이
    • 같은 이름의클래스를 서로 다른 패키지에서 쓸 수 있다
    • 프로그램이 커지게 되면 같은 이름의 클래스가 생겨날 가능성이 높다

다형성 Polymorphism

  • 관련개념 : 상속, 오버라이딩, 형변환

  • 하나의 코드가 여러 자료형으로 구현되어 다른 실행결과를 실행하도록 하는 기술

  • 하나의 객체가 여러 가지 타입을 가질 수 있는 것

  • 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다

  • 부모는 자식을 담을 수 있지만, 자식은 부모를 담을 수 없다.

  • 남자는 사람이다. 여자는 사람이다. 는 맞는 말이지만 사람은 여자이다. 는 틀린말

  • 도형 도형1 = new 원(); 도형 도형2 = new 사각형();

  • 자식에만 있는 멤버나 메서드는 버려진다.

  • 예)

    • 함수(몬스터) 함수(플레이어) 함수(골렘)
    • 오버라이드가 작동되면서 같은 함수지만 다르게 작동한다
    • 함수(캐릭터) 하나의 함수로 몬스터, 플레이어, 콜렘도 받을 수 있게 된다
    • 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
    • 다형성을 잘 활용하면 유연하고, 확장성있고 유지보수가 편리한 프로그램을 만들수 있다

Object클래스

  • 어떤 자료형이든 상관없이 다 관리할 수 있는 자료형식.
  • 모든 클래스의 최종 부모는 Object다. 그러므로 모든 클래스는 Object다.
  • 객체라면 기본적으로 가지고있어야할 속성과 행동을 정의하고 있다
    (모든 객체가 공통적으로 가지고있어야 할 속성과 행동이 정의되어 있다. 사실 Object 클래스에는 필드는 없다. 11개의 메소드만 있다.)
    • toString() // 16진수로된 인스턴스의 주소를 출력
    • equals() // 참조변수가 가르키는 값을 비교하기 때문에 주소비교. 같은 인스턴스인가
    • getClass() // 해당객체의 클래스 타입을 반환

static

  • static을 붙이면 전역변수가 된다.

  • 사용한 코드

  • Main.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package 스태틱연습;

    public class Main {

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    Counter c1 = new Counter();
    Counter c2 = new Counter();
    Counter c3 = new Counter();


    }
    }
  • Counter.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package 스태틱연습;

    //인스턴스가 하나 만들어 질때마다 조회수를 1 높이는 작업
    public class Counter {
    static int count = 0; // 정적화. 전역화 = 프로그램이 생성될때부터 꺼질때가지 유지
    // 전역화 = 정의된 지역에 상관이 프로그램이 실행될때 생성되어 프로그램이 종료될때까지
    // 인스턴스화 하지 않고 클래스를 컴파일할때 메모리에 올라간다
    // 그때 올라가서 프로그램이 종료될 때까지 유지되니 '공유'라는 성질을 갖게 된다.

    public Counter() {
    count++;
    System.out.println("생성됨. count : "+ count);
    }
    }
  • 결과 : static 사용하지 않을 경우

Untitled

  • 결과 : static 사용한 결과

Untitled

부동소수점

  • 10진법, 2진법

  • 고정 소수점 : 소수점의 위치가 고정. 정부부와 소수부로 나뉨

  • 부동 소수점 : 소수점의 위치가 떠다님. 지수부와 가수부로 나뉨

  • type에 대해 이해하기 위해 필요한 개념

  • 코딩이랑 큰 관련 X

  • 0~9 : 범위를 넘어서면 자릿수가 늘어난다.

  • 인류는 손가락이 10개이기 때문에 10진법을 쓰게 되었다.

  • 컴퓨터는 2진법을 쓴다.

  • 컴퓨터는 2진법을 사용한다.

  • 0과 1. true와 false

  • 0010(2) = 0 + 0 + 1*2^1 + 0 = 2

  • 1101(2) = 12^3 + 12^2 + 0 + 1*2^0 = 8 + 4 + 0 + 1 = 13

실습

  • 반복문, 조건문, 배열을 이용하여 문제 해결

  • 부족한 건 구글링으로 보충하자

  • 배열에서 최댓값 찾기 + 위치 찾기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package 자바총복습;

    public class 배열 {
    // 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고
    // 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오
    // 예를 들어, 서로 다른 9개의 자연수
    // 3, 29, 38, 12, 57, 74, 40, 85, 61

    // 입력 : 9개의 자연수가 들어있는 배열
    // 리턴 : 없음
    // 본문 : 최댓값과 몇번째인지 로그로 출력
    // 함수명 : printMaxValIdx

    // 배열, 조건문, 반복문
    int[] arr = {3,29,38,12,57,74,40,85,61};

    public void printMaxValIdx() {

    int max = 0;
    int count=0;
    for(int i=0; i<9; i++) { // 최댓값 찾기
    if(arr[i]>max) {
    max = arr[i];
    count = i;
    }
    }
    System.out.println("Max = " +max);
    System.out.println("해당 숫자의 위치는 : " + count);
    }
    }
  • 큰 수의 각 자릿수를 배열에 담아 0~9가 몇 번 쓰였는지 출력

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package 자바총복습;

    public class 숫자의갯수 {

    //세 개의 자연수 A, B, C가 주어질 때
    //AxBxC 를 계산한 결과에 각각의 숫자가 몇 번씩 쓰였는지를 구하는 함수를 작성하시오
    //예를 들어 A=150, B=266, C=427이라면
    //AxBxC=150 x 260 x 427 = 17037300이 되고,
    //계산한 결과 1703730에 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다

    //인풋 : 정수 3개
    //리턴 : void
    //본문 : 쓰여진 숫자 : 쓰여진 갯수 출력
    //
    //1. 3개의 자연수를 받은 함수 껍데기 만들기
    //2. 3개의 수를 곱한 결과값 뽑기
    //3. 0부터 9까지 반복하면서 각각의 수가 몇번 쓰였는지 파악하기
    public void numCount(int a, int b, int c) {

    int mul = a * b * c;
    System.out.printf("%d x %d x %d = %d \n", a, b, c, mul);

    int[] arr= new int[10];
    int[] printNum= new int[10];

    for(int i=0; i< 10; i++) { // 예)1000을 1 0 0 0 형태로 배열에 담기
    arr[i] = mul % 10; // 10으로 나눈 나머지 = 1의 자리
    mul = mul / 10;
    System.out.printf("%d ", arr[i]);
    }
    System.out.println("");

    for(int i=0; i<10; i++) { // 출력할 수를 printNum에 담는다
    for(int j=0; j<10; j++) { // printNum의 n번째 자리를 숫자 n으로 인식
    if(arr[i]==j) // 예)printNum의 1번째 자리가 2 = 1을 2번 사용함
    printNum[j] += 1;
    }
    }
    System.out.println(); // 결과 출력
    for(int i=1; i<10; i++) {
    if(printNum[i]!=0) {
    System.out.printf("%d 이 %d 개 사용되었다. \n", i, printNum[i]);
    }
    }
    }
    }
  • 배열에 담긴 것에서 n개를 골라 더하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package 자바총복습;

    public class 숫자의합 {
    //인풋 : 숫자가 담갠 배열, 자를 자릿수
    //본문 : 배열에의 첫번째요소부터 자를 자릿수만큼의 수를 모두 합친수를 출력
    // 예) 123456, 3 => 1+2+3 = 6
    //함수명 : printCuttedSum

    public void printCuttedSum(int []arr, int cut) {

    int sum=0;
    for(int i=0; i<cut; i++) {
    sum += arr[i];
    System.out.printf(" %d ", arr[i]);
    if(i!=(cut-1))
    System.out.printf("+");
    }

    System.out.printf("= %d", sum);
    }

    }
  • 배열에서 기준보다 작은 것 큰 것을 나눠서 출력

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package 자바총복습;
    import java.util.Arrays;

    public class 배열나눠서오름차순출력 {
    //divideArrbyNum(int[] 인트형배열, int 기준숫자)
    //인트형 배열 안에서 기준숫자 이상인 엘리먼트 (요소=값하나)와
    //기준 숫자 이하인 엘리먼트 2개로 나눠서
    //각각 모든 요소를 오름차순으로 출력해보세요.
    //예) [1, 2, 3, 5, 7, 80, 150, 2022, 30534]
    //기준이 100이라면
    //[1,2,3,5,7,80] / [150,2022,30534] 로 나뉨
    //생각의 깊이 : 나눠서 정렬을 각각 하는거보다 처음에 정렬을 하면 한번만 하면 됨

    public void divideArrbyNum(int[] arr, int criteria) {

    Arrays.sort(arr); // 정렬

    for(int i=0; i<arr.length; i++) {
    if(arr[i]<criteria) {
    System.out.printf(" %d ",arr[i]);
    }
    }
    for(int i=0; i<arr.length; i++) {
    if(arr[i]>=criteria) {
    System.out.printf(" %d ",arr[i]);

    }
    }

    }
    }

JAVA OOP practice

  • 상속, 클래스 등을 이용해 RPG 만들기

복습

  • 오버라이딩

    = 오버라이트로 기억하자

    = 덮어쓰기. 부모의 자식을 새롭게 함수 정의

  • 오버로딩

    = 파라미터 타입이나 갯수가 다를 때 이름이 같으면서 새롭게 함수 정의

    // 새 이름을 고민하는 시간 단축

    // 이름은 그 함수가 하는 일이 함축되어 있기 때문에 하는 일이 같음을 유추할 수 있다

  • 객체

    = 우리가 프로그램으로 구현할 대상

    = 자바에서는 class로 객체를 설계한다

    = 생성자를 통해 인스턴스를 만든다

    = 인스턴스가 되어야 비로소 메모리에 올라가고 실체화 된다

    = 객체는 변수와 메소드의 묶음이다. 속성과 행동의 묶음이다

  • 생성자

    = 인스턴스를 만들 때 new 키워드와 함께 쓰인다

    = 함수와 비슷하게 생겼지만 이름이 클래스와 같고, 리턴타입이 없다

    = 인스턴스를 만들 때 반드시 필요한 데이터를 강제하는 역할을 한다

    // 준비되지 않은 상태라면 인스턴스를 만들 수 없도록 한다.

    • 추가 정보

      • 생성자를 명시하지 않은 경우 컴파일러가 자동으로 부모의 디폴트 생성자를 호출한다. super();

      • 그렇기 때문에 부모의 사용자정의생성자가 있는데도, 자식에서 부모의 생성자를 호출하지 않는다면 컴파일 에러가 발생한다.

      • 자기의 생성자안에는 최종 조상이 있어야 되는 이런 매커니즘은 최종 조상인 object를 생성할 대까지 계속 된다.

        자식 > 부모 > 조부모 > 조무보의 부모 …… > Object

      • 사용자 정의 생성자가 하나라도 있으면 디폴트 생성자는 호출되지 않는다

      // super()를 를 호출했는데 그 생성자는 없기 때문

  • 추상클래스

    = abstract 키워드가 붙은 메소드(추상메소드)가 하나라도 포함된 클래스를 말한다

    = 클래스 앞에도 abstract 키워드를 붙여줘야 한다

    = 목적 : 상속

    : 미구현된 함수가 있으니 반드시 자식에서 오버라이딩 해야함을 명시적으로 알려준다

    : 미구현된 함수 마고는 자식에서 그대로 상속받아 사용할 수 있다.

  • 상속

    = 자식 클래스 extends 부모 클래스

    = 를 하면 부모의 변수와 메소드를 자식에서 코딩하지 않고도 그대로 사용할 수 있다

    = 부모클래스는 하나밖에 못둔다

    = 동시에 2개 이상의 클래스로부터 상속받을 수 없다.

    • 추가 정보

      = 내가 부모클래스를 만들어 상속을 만들려고 함다면 is a 관계인지 확인해야 한다

      = has a 관계로 상속관계를 구현하는 실수를 하기 쉽다

      = 사각형은 도형’이다’ O

      = 도형은 사각형’이다’ X

      • 부모에 선언된 변수와 같은 이름으로 자식에 선언하면 자식의 것이 사용된다. (오버라이딩 개념)

        ⇒ 나로부터 타고 올라간다.

      • 부모에 변수가 있어도 자식에 있으면 자식 것으로 덮어쓰기 때문

        → 최대한 부모에 있는 변수와 같은 이름으로 자식에 쓰지말고

        → 쓸 경우가 생겼다면 부모에만 넣고 지식에 없애면

      -예를 들어, name이라는 값을 썻으면 먼저 나한테 그 변수가 있나 찾는다

      • 없으면 나의 부모를 찾는다

      • 부모에게 없다면 부모의 부모를 찾는다

      • 이런 방식으로 최종 부모인 Object까지 훑고 올라간다

      • 정리하자면 나부터 타고올라가기 때문에 동시에 잇다면 내것이 우선된다

      • 나한테 없더라도 내 조상 누군가에 있다면 그것을 쓸수 있다.

      → 부모에 있는 나한테 또 정의해놨을 경우

      • 부모에서 변수를 사용하면 부모의 것이 사용되지 자식의 것이 사용되지 않는다

      • 자식에서 변수를 사용하면 자식의 것이 사용되지 부모의 것이 사용되지 않는다.

  • 접근제한자

    = 역할 : 접근을 제한하는 역할.

    = 왜 접근을 제한하는가? 다른 사람 (다른 클래스)가 함부로 나의 값에 접근하거나 수정하는 것을 막기 위해서

    = 노출시키지 않고 싶거나, 노출시키면 안되는 정보들이 있기 때문에

    • private : 자기 클래스에서만 사용
    • default : 해당 패키지 내에서만
    • protected : 해당 패키지 + 상속받은 클래스
    • public : 이 프로젝트내 어디서나

학습목표

  1. rpg 완성

    • Player 클래스와 Monster 클래스에 중복된 코드를 Character를 상속받는 코드로 업그레이드
    • 객체는 call by reference이기에 객체를 출력하면 객체의 값이 아니라 주소가 출력된다
    • 객체를 출력했을 때 자동으로 호출되는 함수가 toString이고 사용자정의하지 않았다면 기본적으로 주소가 출력된다.
    • toString을 통해 값을 출력하도록 만들 수 있다
    • 이클립스에서 우클릭 source - generate toString 들어가서 변수들 체크해주면 값들 찍히게 됨

    f3 : 정의부로 이동

    상속 추가 설명

    구현실습

    캐릭터에 상속바디 완료.zip

    접근제한다

    getter, setter

  2. 이클립스 단축기 복습

  • ctrl + space : 자동완성
  • ctrl + shift + r : 파일명으로 바로 찾기
  • ctrl + d : 한줄 지우기
  • ctrl + alt +키보드아래 : 해당블록 복붙
  • f3 : 정의부로 이동
  • alt + shift + s : Source
  • ctrl + shift + 0 : 자동 import
  • ctrl +shift + f : 자동 들여쓰기
  • ctrl + shift + p : 짝 괄호로 이동
  1. 메소드 복습
  • 파라미터

    • parameter = 매개변수 = 정의할 때 사용한 변수
  • 아큐먼트

    • argument = 전달인자 = 호출할 때 사용한 값
1
2
3
4
5
String a = 'a';
public a(String a){
return a;
}
a(a);

오버로딩, 오버라이딩

  1. 로또 번호 추출

    랜덤

    배열

    Game, Lotto

  • F3
    • 호출한 함수에 F3을 찍으면 정의된 함수 위치로 이동한다

실습 - RPG

  • Game.java 가 main 파일이다

  • Game.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class Game {

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    Player player1 = new Player("kmk");
    Monster enemy1 = new slime("빨간슬라임", 100);
    enemy1.attack(player1);

    // player1.attack(enemy1);
    // player1.attack(enemy1);
    // player1.attack(enemy1);
    // player1.attack(enemy1);
    // player1.attack(enemy1);
    // player1.attack(enemy1);
    // 죽으면 죽었다고 알려주기
    // 죽은 몹에게 공격못하기

    // 무기를 하나 만들어서 그 무기를 장착하면
    // 해당 무기의 데미지만큼 플레이어의 데미지를 올려주세요
    Weapon weapon1 = new Weapon();
    weapon1.name = "창";
    weapon1.damage = 20;
    Weapon weapon2 = new Weapon();
    weapon2.name = "활";
    weapon2.damage = 35;

    player1.setWeapon(weapon2);
    player1.attack(enemy1);

    Potion healPotion = new Potion("회복포션(소)", 30, "빨간색", "회복");
    System.out.println(healPotion.name);

    Potion manaPotion = new Potion("마나포션(소)", 30, "파란색", "마나회복");
    System.out.println(manaPotion.name);

    Golem gol1 = new Golem("바위골렘", 1000);
    System.out.println(gol1.hp);
    gol1.defenceOn();
    player1.attack(gol1);




    }

    }
  • Monster.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // 내부에 미구현인 abstract 클래스가 하나라도 있으면 abstract라 표시
    public abstract class Monster {
    String name;
    int hp = 100;
    int mana = 50;
    int damage = 10;
    String kind;

    public Monster(String name, int hp) {
    this.name = name;
    this.hp = hp;
    }

    public void attack(Player player) {
    if(player.hp<=0) {
    System.out.println(player.name+"은(는) 이미 죽은상태라 공격할수 없습니다");
    return;
    }
    int afterhp = player.hp - this.damage;
    System.out.printf("%s이(가) %s를 %d의 데미지로 공격합니다.\n", this.name, player.name, this.damage);

    if(afterhp<0) { //적이 이번공격에 죽은경우
    afterhp = 0;
    System.out.printf("적이 이번공격에 죽었습니다.\n");
    player.hp = afterhp;
    return;
    }
    System.out.printf("%s의 체력이 %d에서 %d가 되었습니다.\n", player.name, player.hp, afterhp);
    player.hp = afterhp;
    }

    public void powerUp() {
    this.damage *=2;
    }

    }
  • Player.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public class Player {
    //name, hp, mana, damage
    //attack, skill1, skill2
    String name;
    int hp = 100;
    int mana = 100;
    int damage = 20;



    public Player(String name) {
    //this 가 자기자신이고 super는 부모다.
    //super(); //부모의 기본생성자를 호출한거다.
    this.name = name;
    }

    public void attack(Monster enemy) {

    if("골렘".equals(enemy.kind)) {
    if(this.damage <= 40) {
    this.damage = 0;
    }else {
    this.damage -= 10;
    }
    System.out.println("골렘은 10의 데미지를 차감합니다.");
    }


    if(enemy.hp<=0) {
    System.out.println(enemy.name+"은(는) 이미 죽은상태라 공격할수 없습니다");
    return;
    }
    int afterhp = enemy.hp - this.damage;
    System.out.printf("%s이(가) %s를 %d의 데미지로 공격합니다.\n", this.name, enemy.name, this.damage);

    if(afterhp<0) { //적이 이번공격에 죽은경우
    afterhp = 0;
    System.out.printf("적이 이번공격에 죽었습니다.\n");
    enemy.hp = afterhp;
    return;
    }
    System.out.printf("%s의 체력이 %d에서 %d가 되었습니다.\n", enemy.name, enemy.hp, afterhp);
    enemy.hp = afterhp;
    }

    public void setWeapon(Weapon weapon) {
    System.out.printf("%s 장착완료. 데미지 %d증가. \n", weapon.name, weapon.damage);
    this.damage += weapon.damage;
    }
    }
  • Character.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Character {
    String name;
    int hp;
    int mana;
    int damage;
    String kind;

    public Character() {


    }

    public void attack(Character obj) {
    if(obj.hp<=0) {
    System.out.println(obj.name+"은(는) 이미 죽은상태라 공격할수 없습니다");
    return;
    }
    int afterhp = obj.hp - this.damage;
    System.out.printf("%s이(가) %s를 %d의 데미지로 공격합니다.\n", this.name, obj.name, this.damage);

    if(afterhp<0) { //적이 이번공격에 죽은경우
    afterhp = 0;
    System.out.printf("적이 이번공격에 죽었습니다.\n");
    obj.hp = afterhp;
    return;
    }
    System.out.printf("%s의 체력이 %d에서 %d가 되었습니다.\n", obj.name, obj.hp, afterhp);
    obj.hp = afterhp;
    }

    }
  • slime.java

    1
        

실습 - Lotto

  • Game.java가 main 파일이다

  • Game.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package 로또;

    public class Game {

    public static void main(String[] args) {
    // System.out.println((int)(Math.random()*100));
    Lotto lotto = new Lotto();
    lotto.makeLotto();
    System.out.println(lotto);

    Player p1 = new Player("배성원");
    p1.buyLotto(5);
    }
    }
  • Lotto.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    package 로또;
    import java.util.Arrays;
    import java.util.Random;

    public class Lotto {
    //1~45범위에서 중복없이 6개의 번호가 있다
    int [] numArr = new int [6];

    //1. 1부터 45까지의 랜덤 번호 생성
    //2. 배열에 넣기
    //3. 중복이 있으면 다시 뽑기
    //4. 오름차순으로 정렬

    public int getRandomNum(int startNum, int endNum) {
    Random rd = new Random();
    int numArr;
    numArr = rd.nextInt(endNum)+ startNum; // 0~endNum + startNum
    // nextInt(int a) = 0부터 a미만의 랜덤 정수를 리턴
    // 거기에 startNum를 더하면 starNum부터 a+startNum미만의 랜덤정수를 리턴
    // 0부터 45 미만의 수를 뽑아서 1을 더하니까 1부터 46미만의 수를 얻게되는 것
    // System.out.println(num);
    return numArr;
    }
    public Lotto makeLotto() {
    // 1.리턴이 void에서 Lotto로 변경
    // 2.실체화된 인스턴스를 리턴해야 됨
    // 3.int 6개짜리 변수에 랜덤값을 담아 그 Lotto 인스턴스를 반환
    // 4.this로 바꾸는 게 더 좋다

    Lotto lotto = new Lotto();
    int [] newNumberList = new int[6];
    for(int i=0; i<6; i++) {
    int randomNum = getRandomNum(1, 45);
    // 넣기 전에 중복된 것이 있나 검사

    boolean isdup = findDup(numArr, randomNum);
    if(isdup == true) { // 중복이 있다면
    // System.out.printf("%d%s \n", i+1, "번째 숫자 뽑을 때 중복 발생.");
    randomNum = getRandomNum(1, 45); // 새로 뽑기
    // System.out.println("새로 뽑은 값: " + randomNum);
    i--; // 다시 뽑은 것이 중복일 대를 대비하여 방금뽑은걸 다시 검사
    }else {
    newNumberList[i]=randomNum; // 새로뽑은 숫자 현재 자리에 넣기
    }
    }
    sort(newNumberList);
    lotto.numArr = newNumberList;
    return lotto;
    }

    public boolean findDup(int[] arr, int targetNum) {
    //기존의 배열의 값에서 중복된 것이 있나 검색
    for(int i=0; i<arr.length; i++) {
    if(arr[i] == targetNum) {
    return true;
    }
    }
    // System.out.println("중복안됨");
    return false;
    }

    public void sort(int[] arr) {
    Arrays.sort(arr);
    // 정렬 함수
    }
    @Override
    public String toString() {
    return "Lotto [num=" + Arrays.toString(numArr) + "]";

    }
  • Player.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package 로또;
    import java.util.Arrays;

    public class Player {

    String name;
    Lotto[] lottoList;

    public Player(String name) {
    super();
    this.name = name;
    // TODO Auto-generated constructor stub
    }
    public void buyLotto(int n) {
    lottoList = new Lotto[n]; // 인자로 받은 크기로 지정
    for(int i=0; i<n; i++) {
    Lotto lotto = new Lotto();
    lottoList[i] = lotto.makeLotto();
    System.out.println("로또 구매 : "+lottoList[i]);
    }
    // 로또 n 개를 뽑기
    // 뽑은 로또를 내가 보유하고 있는 로또 리스트에 넣기
    }
    @Override
    public String toString() {
    return "Player [name=" + name + ", lottoList=" + Arrays.toString(lottoList) + "]";
    }
    }

배열 (array)

  • 동일한 자료형’의 ‘순차적’인 자료구조

  • 같은 데이터타입의 연관된 여러개의 데이터를 하나의 변수에 담아서 쉽게 관리할수 있도록 해주는 자료구조중 하나

  • 인덱스는 0부터 시작한다.

  • 장점 : 인덱스를 활용하여 빠른 참조가능

  • 단점 : 크기가 선언시의 크기에서 바꿀수 없다.

  • 생성법 : 자료형[] 배열이름 = {값1, 값2, 값3…};

자료형[] 배열이름 = new 자료형[크기];

  • 사용법 : 배열이름[인덱스];

배열의 모든요소 출력 : 반복문쓰거나 Arrays.toString(배열명)

  • 크기 할당 & 초기화 없이 배열 참조변수만 선언

int[] arr;

int arr[];

  • 선언과 동시에 배열 크기 할당

int[] arr = new int[5];

String[] arr = new String[5];

  • 기존 배열의 참조 변수에 초기화 할당하기

int[] arr; arr = new int[5];

//5의 크기를 가지고 초기값 0으로 채워진 배열 생성

  • 선언과 동시에 배열의 크기 지정 및 값 초기화

int[] arr = {1,2,3,4,5};

int[] arr = new int[] {1,3,5,2,4};

int[] odds = {1,3,5,7,9};

String[] weeks = {"월","화","수","목","금","토","일"};

// 2차원 배열 선언

int[][] arr = new int[4][3]; //3의 크기의 배열을 4개 가질 수 있는 2차원 배열 할당

int[][] arr9 = { {2, 5, 3}, {4, 4, 1}, {1, 7, 3}, {3, 4, 5}};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

### **주소값 비교(==)와 값 비교(equals)**

- 원시형 8가지 type이 아니라면 (==) 는 주소값을 비교한다
- 이런 경우에 실제 값을 비교하려면 equals를 사용

> ==연산자와 equals()메소드의 가장 큰 차이점은 == 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데 반해 String클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다는 것입니다. 기본 타입의 int형, char형등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용됩니다. 하지만 String은 일반적인 타입이 아니라 클래스입니다. 클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이 부여됩니다. 그렇기에 String타입을 선언했을때는 같은 값을 부여하더라도 서로간의 주소값이 다릅니다.
>

### 실습 - 배열

- 배열 선언법 정리
- ==와 equal 차이 비교
- 랜덤숫자 맞추기 게임 구현으로 응용

- 배열 연습

```java
package 배열;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {

// 초기화 = 정의 후에 값 할당까지 한 번에 하는 것
int intArr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] intArr3;
intArr3 = new int[]{1,2,3,4,5,6,7,8,9,10}; // Java 형식

// if(intArr == intArr3) {
// System.out.println("같음");
// }

String[] strArr1 = {"일", "이", "삼"};
// 스트링배열을 스트링으로 변환할 수 없습니다.

int twoMension[][] = {{1, 2, 3}, {5, 10, 15}};
// System.out.println(twoMension.length);
// System.out.println(twoMension[1]);


// 향상된 for문. iterator = 반복할수 있는 객체
// iterator의 모든요소에 대해서 반복을 수행
// for(int i : twoMension[1]) {
// System.out.print(i + " ");
// }
// System.out.println("");

int [][][] threeDemension = new int[2][4][6];
// 뒤에서부터 읽는다.
// 2개짜리가 4개 있고 그런 놈이 6개있다. X
// 6개짜리가 4개 있고 그런 놈이 2개있다. O

// System.out.println(threeDemension.length);

String[] 계절 = {"봄", "여름", "가을", "겨울"};
String[] 복사본 = 계절; // 배열의 복사. 그냥 =으로 하면 얕은 복사.
String[] 진짜복사본;
// String[] 진짜복사본2 = new String[];


boolean result = Arrays.asList(계절).contains("핵겨율");
// System.out.println(result);
// if( 계절 == 복사본) {
// System.out.println("복사본 : 같다");
// }else {
// System.out.println("복사본 : 틀리다");
// }

진짜복사본 = 계절.clone();
// if( 계절 == 진짜복사본 ) {
// System.out.println("진짜복사본 : 같다");
// }else {
// System.out.println("진짜복사본 : 틀리다");
// }

// 깊은 복사를 하기 위해서 반복문을 돌리든가, system.arraycopy() 메소드를 이용
// System.arraycopy(계절, 0, 진짜복사본2, 0, 계절.length);
// if(계절 == 진짜복사본2) {
// System.out.println("진짜복사본2 : 같다");
// }else {
// System.out.println("진짜복사본2 : 틀리다");
// }

// 영단어가 저장된 배열. 크기는 5. endDic
// apple, banana, peach
// 한글단어가 저장된 배열. 크기는 5. korDic
// 사과, 바나나, 복숭아
// 한글랜덤단어를 보여주고
// 유저는 영단어를 치고
// 답이 맞는지 틀렸는지 판단
// System.out.println("키보드로 뭔가를 입력해보세요 : ");
// Scanner sc = new Scanner(System.in); // 캐보드로 입력받기 위한 객체 생성
// String input = sc.next();
// System.out.println(input);

}
}
  • 영단어 맞추기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    package 배열;

    import java.util.Arrays;
    import java.util.Random;
    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {


    // 영단어가 저장된 배열. 크기는 5. en1
    // apple, banana, peach
    // 한글단어가 저장된 배열. 크기는 5. kor1
    // 사과, 바나나, 복숭아
    // 한글랜덤단어를 보여주고
    // 유저는 영단어를 치고
    // 답이 맞는지 틀렸는지 판단
    // System.out.println("키보드로 뭔가를 입력해보세요 : ");
    // Scanner sc = new Scanner(System.in); // 캐보드로 입력받기 위한 객체 생성
    // String input = sc.next();
    // System.out.println(input);

    String en1[];
    en1 = new String[]{"apple", "banana", "peach", "watermelon", "pineapple"};
    String kor1[];
    kor1 = new String[]{"사과", "바나나", "복숭아", "수박", "파인애플"};

    Random rd = new Random();
    int randomInt = rd.nextInt(5);
    // System.out.println(randomInt);

    // System.out.printf("%d. %s을(를) 영어로 입력해주세요 : ", randomInt, kor1[randomInt]);

    Scanner sc = new Scanner(System.in); // 캐보드로 입력받기 위한 객체 생성
    // String input = sc.next();
    // System.out.println(input);

    // if(input == en1[randomInt]) {
    // System.out.println("정답입니다!!!");
    // }else {
    // System.out.println("오답입니다");
    // }
    //
    // if(input.equals(en1[randomInt])) {
    // System.out.println("정답입니다!!!");
    // }else {
    // System.out.println("오답입니다");
    // }


    // 문자열 1 == 문자열 2 값을 비교하는게 아니라 주소값 비교
    // 문자열1.equals(문자열2) 값을 비교. 순서 상관 없음.
    }
    }
  • 랜덤 숫자 맞추기 놀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    package 배열;

    import java.util.Arrays;
    import java.util.Random;
    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    // 컴퓨터가 랜덤 1~100 까지의 랜덤 숫자 하나를저장
    // 유저가 5번의 기회동안 그 숫자를 찾는 게임
    // 답이 제출한수 보다 높은지, 낮은지 알려준다
    // 게임이 끝나면 이때까지 유저가 제출했던 답과 컴퓨터의 답을 보여주세요

    int randomInt2 = rd.nextInt(100)+1;

    int[] myAnswer = new int[5];

    int count=1;
    int i=0;
    while(count==1) {

    System.out.printf("1~100 사이의 숫자를 입력해주세요 : ");
    int inputNum = sc.nextInt();
    // System.out.println(inputNum);


    if(randomInt2 == inputNum) {
    System.out.println("정답입니다");
    count --;
    }else {
    System.out.printf("다시 입력해주세요 %d %d \n", randomInt2, inputNum);

    if(randomInt2 > inputNum) {
    System.out.println("더 높은 숫자입니다");
    }else {
    System.out.println("더 낮은 숫자입니다");
    }
    myAnswer[i] = inputNum;
    System.out.printf("==================== \n");
    }
    i++;

    if(i==5) {
    count--;
    }
    }
    System.out.printf("==================== \n");
    System.out.printf("==================== \n");
    System.out.printf("==================== \n");
    System.out.printf("지금까지 입력했던 답입니다 :");
    for(int j=0; j<myAnswer.length; j++) {

    if(myAnswer[j]==0) {
    continue;
    }
    else {
    System.out.printf("% d ", myAnswer[j]);
    }
    }
    System.out.println("");
    System.out.printf("정답을 공개합니다 : %d", randomInt2);

    }
    }

JAVA OOP

객체 지향 - class

클래스

  • class는 객체에 대한 설계도
  • 설계도 대로 인스턴스를 하나 만들면 그제서야 메모리에 올라간다

사용법

  • 객체를 사용해보자.
  • 어떻게?
    1. 서로 다른 클래스에 함수를 만든다
    2. main에서 사용할 클래스의 함수를 new로 선언한다. (생성자 이용 가능)
    3. new로 선언한 클래스의 변수나 함수를 호출하여 사용

생성자 Constructor객체

  • 역할 : 객체를 인스턴스화(생성) 하는 역할

  • 문법 : 함수와 비슷하게 생겼는데 이름이 클래스명이고 리턴 값이 없다

  • 객체를 생성할 때 new 키워드와 함께 사용. 생성할 때 필요한 데이터를 강제하는 역할

  • 클래스에는 반드시 최소하나이상의 생성자가 존재

  • 클래스에 생성자가 명시적으로 없더라도 컴파일러가 디폴트 생성자를 넣어주기 때문에 new키워드와 함께 생성자를 호출 가능하다

  • 디폴트 생성자는 매개변수와 구현부가 없다

실습

  • Human 클래스를 만든다
  • 객체로서 필요한 정보(이름,나이 등)를 설정
  • 객체로서 행동(달리기, 동물 기르기 등)을 설정
  • Human.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Human {
// 이름, 나이, 성별
// 길들이다, 먹이를 주다, 달리다

String name = "김씨";
int age = 20;
String gender = "male";

public void taming(Dog animal) {
System.out.println(this.name + "이(가) " + animal.name+"을(를) 길들이겠습니다.");
}
public void feed() {
System.out.println("동물에게 먹이를 주다");
}
public void run() {
System.out.println("달려나가다");
}
}
  • Dog 클래스를 만든다
  • 객체로서 필요한 정보(이름, 나이 등)를 설정
  • 객체로서 행동(달리기, 점프하기 등)을 설정
  • Dog.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Dog {
// 털색, 키, 몸무게, 품종, 나이, 걷기, 뛰기, 점프하기,
// 구르기, 활퀴기, 자기, 먹기, 울음소리
String name = "멍멍이";
String color = "갈색";
double weight = 15.3;
String kind = "달마시안";
int age = 5;

public void walk() {
System.out.println("걷습니다.");
}
public void run() {
System.out.println("달립니다.");
}
public void jump() {
System.out.println("점프합니다.");
}
}
  • Main에서 의도대로 작성한 클래스들을 이용해본다
  • main.java
1
2
3
4
5
6
7
8
9
10
11
public class Main {

public static void main(String[] args) {

Dog mydog1 = new Dog(); // Dog클래스에서 mydog1 객체 생성
System.out.println(mydog1.name); // mydog1 이름 출력

Human kim = new Human(); // Human클래스에서 kim 객체 생성
kim.taming(mydog1); // kim이 mydog1을 인자로 받아서 함수 싱행
}
}
  • 결과
  • main.java 클래스를 실행한 결과이다.

Untitled

생성자 사용 vs 비사용

  • 생성자 = 객체를 생성할 때 new 키워드와 함께 사용. 생성할때 필요한 데이터를 강제하는 역할.

[생성자 비사용]

  • 특징 : 미리 변수의 내용을 설정해야 한다

  • Human.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Human {
    // 이름, 나이, 성별
    // 길들이다, 먹이를 주다, 달리다
    String name="김씨";
    int age=10;
    String gender="male";

    public void walk() {
    System.out.println("여유롭게 걸어갑니다");
    }
    public void run() {
    System.out.println("신속하게 달려나갑니다");
    }
    }
  • Main.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Main {

    public static void main(String[] args) {

    Human kim = new Human(); // Human 클래스에서 kim 객체 생성
    System.out.println(kim.name); // kim 이름 출력
    kim.walk(); // kim의 함수 호출

    // Dog dog1 = new Dog(); // Dog 클래스에서 dog1 객체 생성
    // dog1.jump(); // dog1의 함수 호출

    }
    }

Untitled

[생성자 사용]

  • 특징 : 미리 변수의 내용을 설정하지 않아도 작동한다

  • 단, 생성할때 필요한 데이터 입력를 강제한다

  • 생성자 쉽게 생성 = ctrl + space바 + Enter

  • Human.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Human {
    // 이름, 나이, 성별
    // 길들이다, 먹이를 주다, 달리다
    String name;
    int age;
    String gender;

    public Human(String name, int age) {
    this.name = name;
    this.age = age;

    }
    public void walk() {
    System.out.println("여유롭게 걸어갑니다");
    }
    public void run() {
    System.out.println("신속하게 달려나갑니다");
    }
    }
  • Main.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Main {

    public static void main(String[] args) {

    Human kim = new Human("아무개", 21); // Human 클래스에서 kim 객체 생성
    System.out.println(kim.name); // kim 이름 출력
    kim.walk(); // kim의 함수 호출

    // Dog dog1 = new Dog(); // Dog 클래스에서 dog1 객체 생성
    // dog1.jump(); // dog1의 함수 호출

    }
    }

Untitled

개인 실습

  • 이후에 개인적으로 클래스를 사용해보자
  • 간단한 게임 제작
  • 위에서 한 것처럼 플레이어 클래스, 몬스터 클래스를 생성
  • 서로에게 공격하는 함수를 넣고 main에서 사용해보자

JAVA base

클래스, 상속, 추상화 등의 개념 정리


JAVA

jdk, jre, jvm

  • jdk = 자바 개발도구(Java Development Kit)
  • jre = 자바 실행환경(Java Runtime Environment)
  • jvm = 자바 가상머신(Java Virtual Machine)

버전 명칭

  • version 1.8 = 8 버전
  • version 1.9 = 9 버전

dynamic typed 인터프리터

컴파일

  • 컴파일 = compile = 코드를 기계어(이진수 코드. 0과 1로) 바꾸는 것
  • 컴파일. javac
    • .java 파일을 javac가 컴파일하면 .class파일로 변환된다.
    • .class파일이 JVM의 클래스로더에게 전달되고 JVM은 메모리에 올린다.
    • 프로세스가 실행된다.

프로그램 vs 프로세스

  • 프로그램이 실행되면 프로세스
  • 실행됬다는 것은 메모리에 올라갔다는 의미

변수

  1. 반복해서 사용할 때 코딩의 반복을 막기 위함
  2. 값의 이름을 정의하기 위함
  • 자바에서 변수 선언하는 법
    • 데이터타입 변수명 = 값;
    • 예) int a= 5;

데이터 타입

  1. primitive(기본형)
  • call by value
  • 8가지 기본형
    • boolean
    • char
    • byte, int, short, long
    • float, double
  1. object(객체. 참조형)
    • call by reference
    • a의 주소값은 그대로고 값이 바뀌는 것이 아니라 주소가 변경된다. 원시형 데이터 타입이 아니기 때문.
1
2
string a = “안녕하세요”;
a = "헬로월드";

함수

  • 특정 프로세스를 반복하여 사용할 때 유지보수를 간편하게 한다

  • 이 프로세스가 무엇을 하는지 명확하게 이름을 지어 코드작성과 읽기를 편하게 하기 위함

  • 자바에서 함수 정의하는 법

    • 접근제한자 리턴타입 함수명(데이터타입 이름){본문};
    • 예) public int sum(int a, int b){ returmn a+b; }
  • 함수 호출하는 법

    • 함수명(매개변수);

디버거

  • 사용 목적 : 코드를 컴퓨터가 실행하는 과정으로 각 단계별로 추적하여 버그를 고치는 것을 간편하게 한다
  • 자바스크립트에서 쓰는 법:
    • 멈출 코드의 라인에 debugger;를 작성하고 코드 화면 우클릭하여 디버거 모드로 실행(개발자 모드)
  • 자바에서 사용하는 법
    • 멈출 코드의 라인에 브레이크 포인트를 걸고 디버거 모드로 실행(debug as)

node.js

  • 자바스크립트를 브라우저 외에 환경에서 실행하게 해주는 런타임 환경

부가 설정

  • 일단 이클립스(STS)는 JDK를 통해서 컴파일 하지 않는다.
  • 기본적으로 내장된 컴파일러를 사용한다
  • 성정을 변경하려면 다음과정을 거친다
    • STS → window → preference → compiler 검색 → 버전 변경 : 11
    • STS → window → preference → installed 검색 → jre 11d에 체크

while문

  • 언제 while을 사용하고 언제 for를 사용하는가?
    • 조건이 ‘상환, 컨디션’으로 정해지면 while이 편하고, 조건이 ‘횟수’로 정해지면 for가 편하다.
    • 하지만 for와 while은 서로 변환할 수 있다.

새로 배우기


  • 좋은 설계 = 높은 응집도 and 낮은 결합도

은닉화, 캡슐화

  • 어떻게 동작하는지 원리를 몰라도 사용법만 알면 사용할 수 있다.
  • 전화번호는 국제적으로 어떻게 한 사람이 하나의 번호를 부여받고 통신하는 어떻게 그것을 관리하고
  • 4g,5g는 무엇이고 우리가 전화번호로 통화 버튼을 누르면 어떤 정보가 어디로 가서 어덯게 처리되어 통화 작업이 일어나는지
  • 음성은 어떻게 데이터화되서 전달되는지

클래스

  • class는 객체에 대한 설계도
  • 설계도 대로 인스턴스를 하나 만들면 그제서야 메모리에 올라간다.

오버로드

  • Overload : 오버로드. 이것도 싣도 저것도 싣고.
  • 함수의 이름이 같은데 파라미터가 다를 경우 서로 다른 함수같이 작동되는 매커니즘.
  • 호출할때의 데이터타입과 객수를 보고 그렇게 정의했던 함수가 호출된다.

프로그래밍 패러다임

  • 객체지향 프로그래밍 (OOP = Objected Oriented Promgramming)
  • 절차지향적 → 객체지향적으로 발전에 의해 변경됨
    • 장점 : 사람이 세상을 보는 것과 같은 방식
    • 단점: 간단한 것 하나를 만들려고해도 설계부터 해야한다.

일급 객체

일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

  1. 변수에 할당할 수 있다.
  2. 다른 함수를 인자로 전달 받는다.
  3. 다른 함수의 결과로써 리턴될 수 있다.
  • JAVA의 함수 = 일급 객체

콜백함수

  • 비동기적 프로그래밍을 하기 위해서 콜백함수를 사용.
  • 비동기적 == 비절차적
    • 동기적이지 않다. 즉, a가 시작된 후에 a가 끝나지 않더라도 b가 시작될수 있는 것
  • 동기적 == 절차적
    • a 가 끝나야 b가 시작되는 서로다른 두 객체간의 시간적 값의 일치
  • 왜 비동기적 프로그래밍을 하나요?
  • 동기적 프로그래밍의 단점 :
    • 에러가 나면 정지된다. 하나만 틀려도 전체가 틀어진다.
  • 동기적 프로그래밍의 장점:
    • 병렬적으로 일을 처리할 수 있기 때문에 속도를 높일 수 있다.
  • 반드시 나 이전의 일이 끝나기를 기다릴 필요가없을 때 병렬적으로 일츨 처리하면 속도를 높일 수 있기 때문
1
2
3
4
5
6
7
8
9
10
// 콜백 방식
function matchQuiz(answer, printTrue, printFalse){
if(answer[0]==="무령왕릉"){
printTrue();
}else{
printFalse();
}
}
printTrue() 정의
printFalse() 정의

생성자 Constructor객체

  • 역할 : 객체를 인스턴스화(생성) 하는 역할
  • 문법 : 함수와 비슷하게 생겼는데 이름이 클래스명이고 리턴값이 없다

객체를 생성할 때 new 키워드와 함께 사용. 생성할때 필요한 데이터를 강제하는 역할

클래스에는 반드시 최소하나이상의 생성자가 존재

클래스에 생성자가 명시적으로 없더라도 컴파일러가 디폴트 생성자를 넣어주기 때문에 new키워드와 함께 생성자를 호출가능

디폴트 생성자는 매개변수와 구현부가 없다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Potion {

String name;
int recovery; // 회복양
String color;
String type;


public Potion(String 이름, int 회복량, String 색깔, String 종류) {
name = 이름;
recovery = 회복량;
color = 색깔;
type = 종류;
}

}
  • 생성자 생성
    • Ctrl + Space바 + Enter

생성자가 무엇인지 설명하고 왜 사용하는 설명하라.

 ⇒ 객체를 생성할 때 쓴다.
  • 객체가 생성될 때 필요한 데이터를 강제하는 역할을 한다.

    ⇒ 필요한 데이터가 준비되었다면 쉽게 객체를 만들 수 있도록 한다.

    ⇒ 데이터가 아직 준비되지 않았다면 객체를 생성할 수 없도록 한다.

추상화, 상속

  • 객체 : 소프트웨어로 구현할 대상. 개념

  • 인스턴스 : 클래스(설계도)로 구현된 구체적인 실체

  • 추상클래스 : 자식 extends 부모.  자식은 하나의 부모’만’ 가질수있다.

  • 동물 > 척추동물 > 포유강 > 식육목 > 고양잇과 > 표범과 > 표범

  • 클래스가 미완성이라는 것은 추상메소드가(abstract가 붙은 메소드) 하나 이상 포함된 클래스라는 말

  • 추상클래스로 인스턴스 생성은 불가능. 상속을 통해서 자식클래스에 의해서만 인스턴스를 생성할 수 있다.   부모가 만들어놓은것을 이어받아 자식이 완성시켜야 한다

  • Quiz!

    • 우리 아빠의 그랜저 = 인스턴스
    • 그랜저라는 개념 = 객체
    • 현대자동차의 그랜저 설계도 = 클래스
    • 중국으로 일부 유출된 그랜저 설계도 = 추상클래스

Override

 = 부모에 있는 메소드의 형태와 같은 메소드를 자식에 선언했을 때 자식의 메소드가 부모의 메소드를 덮어쓰는 매커니즘

오버로드 , 오버라이드 **차이점

  • 오버로드 = 과적재 = 이거 싣었다가 저거 싣었다가

    = 함수의 이름이 같고 파라미터가 다른 여러함수를 정의해놨을 때 함수호출시의 파라미터에 맞춰서 그에 맞는 함수가 호출되는 것.

  • 오버라이드 = 오버라이트 = 덮어쓰기

    • 상속이라는 개념을 먼저 알아야 한다. 부모클래스와 extends

추상클래스

  • abstract 키워드가 붙은 메소드가 하나라도 있는 클래스
  • 사실은 구현되다가 만놈(완벽하게 개발을 끝내지 못함)인데 내가 만든 클래스를 다른 사람이 상속받게 되면 미완성인 것을 사용하게 된다.
  • 추상클래스로는 인스턴스를 만들 수 없다. 왜냐? 미완성된 놈이니까.
  • 자식에서 반드시 추상 메소드를 오버라이드 해줘야 한다.

JAVA Debugger

디버거 (debugger)

  • de + bug = 버그를 없애다
  • 개발에 매우 중요한 모드

Java에서 사용하는 법

  • 원하는 라인에 더블클릭 = 파란색 브레이크 포이트 걸기
  • 우클릭 : debug as로 실행

Untitled

  • 디버그 모드 탈출
  • 우측 상단에 벌레 아이콘 옆에 있는 Java 아이콘 클릭
  • 해당 아이콘을 클릭하면 개발자 모드로 돌아올 수 있다.

Untitled

Java Script에서 사용하는 법

  • 지정할 브레이크 포인트에 debugger; 작성

  • 개발자모드를 열어놓은 상태에서 해당 영역에 도달한다

  • 브라우저 → 우클릭: 감사

  • Console 창에서 실행) 함수를 복사해서 붙여넣는다

  • 함수를 호출한다

Untitled

  • 디버거 모드 진입
  • F9
    • 해당 키를 통해서 순차적으로 코드를 살펴보면 된다

Untitled

디버거의 용도

  • 혼자하는 작업만 고려한다면 필수는 아니다
  • 하지만, 수십명이 함께 작업한 코드를 분석할 경우에는 상황이 매우 복잡해지므로
  • 다수가 함게하는 작업에서 특히 유용한 것이 디버거이다
  • 디버거의 활용으로 (초급 개발자) / (중급 개발자)로 나뉜다는 듯

JAVA start

코드 작성 팁

  • System.out.println() 작성하는 단축키
    • Syso + ctrl + space 바
  • 한줄 복사
    • ctrl + alt + 아래방향키

Hello World

  • Spring Tool Suite4 실행
  • 프로젝트 생성
  • 우클릭 : 생성한 프로젝트의 src → New → class

Untitled

  • Main 이라고 명명

Untitled

  • 코드 작성
    • 팁 : ctrl + space바
1
2
3
4
5
6
7
8
package variable;

public class Main {
public static void main(String[] args) {
System.out.println("헬로 월드");
}

}
  • 저장 후 실행 결과

Untitled

  • 여러가지 코드를 작성해보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package variable;

public class Main {
public static void main(String[] args) {
// System.out.println("헬로 월드");

int a = 5;
double b = 5.5;

System.out.println(a+b);

char x = 'a';
String y = "hello";
System.out.println(x+y);

int myNum = a;
myNum = myNum + 10;
System.out.println("Mynum : " + myNum);
System.out.println("a : " + a);

Integer myInt = 5;
Integer bInt = 9;
myInt = bInt; // 9

myInt += 5; // 14
bInt += 10; // 19
System.out.println("myInt : "+myInt);
System.out.println("bInt : "+bInt);
}
}

call by value, call by reference

  • Main.java
  • call by value = 값에 의한 참조
  • call by reference = 주소에 의한 참조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package variable;

public class Main {
public static void main(String[] args) {
// System.out.println("헬로 월드");

int a = 5;
double b = 7.5;

System.out.println(a+b);

// call by value. 기본형. 값에 의한 참조
char x = 'a';
String y = "hello";
System.out.println(x+y);

int myNum = a;
myNum = myNum + 10;
System.out.println("Mynum : " + myNum);
System.out.println("a : " + a);

// call by reference. 참조형. 주소에 의한 참조
String[] imgArr = {"🍕", "🍖"};
String[] stringArr = {"피자", "통닭", ""};
imgArr = stringArr; // 한글이 들어감
stringArr[2] = "아이스크림";

int i=0;
System.out.println(imgArr[0]);
System.out.println(imgArr[1]);
System.out.println(imgArr[2]);

// for(i=0; i<imgArr.length; i++) {
// System.out.println(imgArr[i]);
// }
}
}

연산자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package variable;

public class 연산자 {
public static void main(String[] args) {

int a = 100;
int b = 333;

System.out.println(a++ + ++b); // 100 + 334 = 434
// ++ 이나 -- 증감연산자가
// 뒤에있으면 사용한뒤 값을 변경
// 앞에 있으면 변경한 뒤에 사용

}
}

JAVA Setting with STS

사전준비

  • VSCord 설치

visual studio 추가 설치

  • extension → 검색:markdown → 다음 확장 프로그램 3가지 설치

Untitled

  • 우측 위 돋보기 모양 클릭 → 마크다운 preview 참고하며 작성하자

Untitled

node.js

: 웹 브라우저가 아닌 환경에서 자바스크립트를 실행시킬 수 있는 런타임 환경

  • 웹브라우저에서 동작하는 ‘프로그래밍 언어’는 only 자바스크립트뿐이다 O
    • 단, 다른 언어로 웹에서 동작하는 프로그래밍을 할 수 있다. —> 결국 자바스크립트로 변환
  • 자바스크립트는 only 웹브라우저에서만 동작할 수 있다. O??
    • NODE JS가 이 문제의 답을 X로 만들었다.

node.js 설치

  • 구글링하여 설치
  • 설치 확인 : 명령 프롬프트에서 node -v

Untitled

code runner 설치

  • node.js 설치된 상태에서 설치해야 한다.
  • visual studio → extension → 검색 : code ruuner
  • 설치 후 visual studio 재부팅
  • 우측 상단에 동영상 재생 마크와 유사하 것이 생성됨 = 코드 러닝 버튼

Untitled

run code사용

  • 코드 작성 후 run code 버튼 클릭

Untitled

  • 결과

Untitled

STS 설치

구글링 : sts4

https://spring.io/tools

  • 가장 아래에 window로 설치

Untitled

JDK - 1.11 다운로드

Untitled

  • 다음 경로를 참고해서 설치

Untitled

버전 확인

  • 다음 코드로 버전을 확인했을 때 11버전이 출력되어야 한다
  • java -version
  • javac -version
    • javac = java 컴파일러

Untitled

다른 버전이 출력될 경우

검색창 : 변수 → 환경변수 → JAVA_HOME 을 편집으로 바꾼다

  • 없다면 설정한다
  • java 경로로 변경한다
    • C:\Program Files\Java\jdk-11.0.15
  • 다시 버전 확인한다

STS 설치

  • 파일 이름 길이가 너무 길기 때문에 줄인다
    • 예시) spring-tool-suite-4.jar

Untitled

  • spring-tool-suite-4.jar → contents.zip 앞축을 풀고 들어간다

  • contents → sts-4.14.1.RELEASE 폴더를 안전한 경로에 복사 붙여넣기

  • string-tool-suite4를 복사하여 백업본을 만들어둔다

  • 우클릭 : string-tool-suite4 → 메모장으로 열기

  • 메모장에서 메모리를 수정

  • 램 용량을 표시

  • 내 컴퓨터 → 속성

  • 램 용량 확인 = 본인은 8G

Untitled

  • 본인 RAM의 1/8, 1/4 이 되도록 표시

  • 8G의 8/1 = 1G = 2^10 = 1024

  • 8G의 4/1 = 2G = 2*2^10 = 2048

  • 즉, -Xms1024m
    -Xmx2048m

  • 이후 저장한다

Untitled

Spring Tool Suite4 실행

  • sts-4.14.1.RELEASE 폴더 → sprinttoolsuite4.exe 를 작업표시줄에 고정
  • sprinttoolsuite4.exe 실행
    • workspace 설정을 요구할 것이다

Untitled

  • sts-4.14.1.RELEASE 있는 경로에 폴더 생성 : workspace_seoulAI
  • 해당 경로에 경로 설정

Untitled

Spring Tool Suite에서 추가 설치

  • Help → eclipse Marketplace → 검색 : Java and Web developer tool → 설치

Untitled

UTF-8 설정

  • window→preference → encoding 검색
  • java class file, text, text→java Properties File 이 3개에 대해서 utf-8 추가한다
  • 추가 방법
      1. Content types: 에서 3개 중에서 설정할 것을 선택
    • 2.다음과 같이 하단에 utf-8 적고 Update
    1. 3개 모두 같은 방법으로 utf-8을 추가해준다

Untitled

  • General - Workspace → 설정 : utf-8

Untitled

  • 다음 그림의 좌측에 보이는 모든 메뉴에 들어가서 설정 변경
  • 설정 변경 : utf-8

Untitled

추가 설정

  • Window → preference → 검색 : installed → add

Untitled

  • Standard VM 더블 클릭

Untitled

  • directory 선택

Untitled

  • jdk-11 선택

Untitled

  • 11버전이므로 아래 2개중에서 아래 것을 체크
  • 13버전 이상일 때만 다음 그림과 다르게 체크
  • finish → 다음 페이지에서 위에 항목을 체크 → Apply and Close
  • *이후에 코드 실행하여 Linkage… 에러가 생기면 이 설정을 변경해보자

Untitled

프로젝트 생성

  • 기본 화면에서 좌측 workspace의 Create Java project를 클릭
  • Create Java project → 다음 그림 참고하여 체크 → 생성한다

Untitled

  • 다음과 같이 생성되었다

Untitled

JDK

  • JDK는 자바 개발도구(Java Development Kit)의 약자이다
  • JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다

Untitled

Hello World

  • 우클릭 : src → New → class

Untitled

  • Main 이라고 명명

Untitled

  • 코드 작성
    • 팁 : ctrl + space바
1
2
3
4
5
6
7
8
package variable;

public class Main {
public static void main(String[] args) {
System.out.println("헬로 월드");
}

}
  • 저장한 후에 실행한 결과

Untitled

JavaScript AJAX

프로그램 언어별 포지션

  • Front-End : Web Browser 등 사용자와 접점을 가지고 있는 부분을 개발
  • Back-End : 데이터 기반의 로직을 기반으로 솔루션의 엔진을 담당

Untitled

JAVA 언어의 단계

  • 현재 취업시장에서 가장 많은 것은 웹 프로그래머
  • 웹 프로그램은 서블릭 ➔ JSP ➔ Spring의 단계로 교육이 진행될 예정

Untitled

비동기(Asynchronous) 통신이란?

  • AJAX (Asynchronous Javascript And XML) : XHR(XMLHttpRequest), AXIOS, FETCH 방식
  • 비동기 애플리케이션을 만들기 위해 클라이언트에서 단에서 쓰이는 웹개발 기술들.

Untitled

비동기 통신의 탄생배경

  • 기존 웹문서는 구조가 바뀌면 모든 문서를 변경해야 하는 한계가 있음. (유지관리 비용 증가)
  • 한계를 극복하고자 비동기 통신이 탄생함

Untitled

비동기 통신 구현 원리

  • innerHTML을 활용하여 이벤트 발생시 article 태그에 문서를 삽입한다
  • 문서 삽입은 querySelector를 활용
  • ajax_01.html 일부
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<body>
<ol>
<li><a onclick="document.querySelector('article').innerHTML='<h1>HTML</h1><P>HTML is ....</P>';">
HTML</a></li>

<li><a onclick="document.querySelector('article').innerHTML='<h1>CSS</h1><P>CSS is ....</P>';">
CSS</a></li>

<li><a onclick="document.querySelector('article').innerHTML='<h1>JAVA Script</h1><P>JAVA Script is ....</P>';">
JAVA Script</a></li>
</ol>
<article>
</article>
</body>
  • 결과

Untitled

비동기 통신 구현을 위한 TEST - 1

  • callback 함수를 통한 로그 확인. (JAVASCRIPT 문서 확인함.)
  • 로그가 먼저 찍히고, response OK가 됨. (비동기식이므로)

Untitled

비동기를 결과를 확인

  • 먼저 1 2 3 출력
  • 그 다음에서야 response.OK!! 출력

Untitled

비동기 통신 구현을 위한 TEST - 2

  • CSS 문서 확인하여 text란 변수에 넣어라.
  • response.status = 200은 통신에 성공했다는 의미임

Untitled

5.4.3. 비동기 통신 구현을 위한 TEST - 3

  • FETCH API는 전달하는 문서를 text로 받고, inner HTML을 통해 article tag에 문서를 포함
  • 이 때 response 객체를 통해서 성공여부를 확인할 수 있음 (AJAX의 기본은 마무리)

Untitled

  • 여기까지 작성했을 때의 코드
  • ajax_02.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type ="button" value = "click callbackMe"
onclick="fetch('JAVASCRIPT').then(callbackme);
function callbackme(){
console.log('response. OK!!');
};
console.log(1);
console.log(2);
console.log(3);
"
>
<!-- JAVASCRIPT 문서를 읽으면, response라는 변수에 담아와라. -->
<!-- response 변수의 text함수를 통해서 읽어온 값을 alert 해라.-->
<input type="button" value="click AJAX"
onclick="fetch('HTML').then(function(response){
response.text().then (
function(text) {
alert(text);
console.log(response);
console.log(response.ok); // true, false
console.log(response.status);// 200은 성공, 404는 페이지 못찾음
})
});"
>
<input type="button" value="click AJAX_ERROR처리"
onclick="fetch('HTML').then(function(response){
response.text().then (
function(text) {
if (response.ok) {
// alert(text);
document.querySelector('article').innerHTML=text;
console.log('success');
}
else {
console.log('ERROR');
}
})
});"
>
<article>

</article>

</body>
</html>
  • CSS
  • 확장자 없이 해당 이름으로만 만든 파일이다
1
<h1>CSS</h1><P>CSS is ....</P>
  • JAVASCRIPT
  • 확장자 없이 해당 이름으로만 만든 파일이다
1
<h1>JAVA Script</h1><P>JAVA Script is ....</P>
  • HTML
  • 확장자없이 해당 이름으로만 만든 파일이다
1
<h1>HTML</h1><P>HTML is ....</P>
  • 결과
  • 버튼을 1번씩 클릭했을 때 다음과 같은 결과가 출력된다

Untitled

비동기 통신 구현을 위한 TEST - 4

  • 공통된 부분을 하나로 합쳐서 처리
  • 위 코드를 다음 형태로 정리할 수 있다

Untitled

실습

  • Do it! 웹 사이트 따라 만들기 7장 p.214
  • 우선 chrome → 우클릭 : 속성 → 대상에 다음 내용을 붙여넣는다.
    • exe” 이후에 띄어쓰고 붙이면 된다
    • -allow-file-access-from-files

Untitled

JavaScript JQuery

jQury를 사용해보자

JQuery란?

  • JQuery 사용이유 : 브라우저간 호환성 문제, CSS지원, 복잡한 HTML 문서를 단순화하는 용도
  • 기본적으로 JAVA Script 문법을 기반으로 활용이 가능하다

Untitled

  • 이 기종으로 관리되는 모든 Browser의 기능을 숨긴다
  • Jquery Object를 통해서 Document Object를 관리

Untitled

Jquery 셋업

  • Jquery 라이브러리는 서버에 다운로드 하여 사용하는 방법과 CDN을 활용하는 방법이 있음
  • CDN : Content Delivery Network
  1. 각 주요 사이트별로 호스팅하고 있는 CDN이 있음
  2. CDN을 이용하는 것이 효율적인 이유는
    다른 사이트도 Jquery로 개발된 사이트가 많다보니
    Cash에 대부분 CDN 사이트 로부터 받아놓은 것이 있을 수 있음.
  3. 단, 다운로드도 받아놓는 것은 인터넷이 끊기거나.
    호스팅 사이트가 사라질 수도 있는데. 이 때 주소만 바꾸면 되며
    보험용으로 라이브러리로 다운로드 받아서 관리하고 있으면 좋음

설치

  • Jquery

https://jquery.com/

Untitled

Untitled

  • Download 탭에서 아래로 스크롤
  • Google CDN 이동

Untitled

Untitled

  • 다음과 같은 형태로 사용
1
2
3
4
5
6
7
8
9
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

</head>

Jquery 시작하기

  • Jquery 맛보기
  • jquery는 chain의 형태로 대상과 대상이 해야할 일에 대해서 처리

Untitled

선택자

  • 선택자를 활용하여 선택된 대상에 CSS를 적용할 수 있다

Untitled

선택자 실습

  • 선택자를 사용해본다
  • jquery_test_02.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
// 모든 문서가 로드가 되면..
$(function(){
// 직접선택자
$(".wrap-1").css("border","1px solid orange");
$(".wrap-1 p").css("background","yello");
// 근접선택자
$(".active").next("p").css("background", "aqua");
// 위치선택자
$(".wrap-1 p").eq(1).css("font-size","5px");
// 속성선택자
$("input[type-text]").css("background","orange");
// 객체조작 ==> class="active" 제거. aqua 컬러 미적용
$(".wrap-1 p").eq(1).removeClass("active");
$(".active").next("p").css("background", "aqua");
// 객체조작 ==> class="active" 추가. aqua 컬러 적용
$(".wrap-1 p").eq(1).addClass("active");
$(".active").next("p").css("background", "aqua");
// 객체조작 ==> tag를 추가함

$(".wrap-1 p").append("<p>휴먼교육센터</p>");
});
</script>
</head>
<body>
<div class="wrap-1">
<p>텍스트1</p>
<p class="active">내용2</p>
<p><a href="https://www.naver.com/">네이버</a></p>
<p><input type="text" value="hello"></p>
</div>
<div class = "wrap-2">
<p>내용5</p>
<p>내용6</p>
</div>
</body>
</html>
  • 결과

Untitled

이벤트 핸들링

  • Jquery 는 발생하는 이벤트를 체크하여 문서를 관리할 수 있음

Untitled

이벤트 핸들링 실습

  • jquery_test_03.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
// 모든 문서가 로드가 되면..
$(function(){
// $(".btn1 a").mouseover(function(){
// alert("휴먼교육센터");
// })

// 2개 이상의 이벤트를 동시에 적용 가능
// $(".btn1 a").on("mouseover focus", function(){
// // 선택된 대상
// let ts = $(this);
// ts.css("background-color", "yellow");
// });

$(".btn1 a").on("mouseover focus", function(){
// 선택된 대상
let ts = $(this);
// 선택된 대상의 ul 태그 중 visible이 포함된 것이라면 hide(숨기고)
$(".btn1").next("ul").filter(":visible").hide();
// 선택된 부모(p)의 다음 것을 출력
ts.parent().next().show();
return false;

});
});
</script>
</head>
<body>
<p class="btn1"><a href = "#">이벤트 대상1</a></p>
<ul style="display:none">
<li>리스트1</li>
<li>리스트2</li>
<li>리스트3</li>
</ul>

<p class="btn1"><a href = "#">이벤트 대상2</a></p>
<ul style="display:none">
<li>리스트4</li>
<li>리스트5</li>
<li>리스트6</li>
</ul>

</body>
</html>
  • 결과

Untitled

효과 및 애니메이션

  • Jquery 는 이벤트 발생시 효과 및 애니메이션 기능을 수행함
  • 효과 메서드
    • 요소를 역동적으로 숨겼다 보이도록 해주는 매서드가 있다
    • 선택한 요소에 동적으로 적용 가능
  • 효과 메서드 사용법
    • $(요소 선택).효과 메서드(효과소요시간, 가속도, 콜백함수)
  • 애니메이션 사용법
    • $(요소 선택).animate({적용할 속성과 값}, 가속도, 콜백함수);

애니메이션 실습02

  • jquery_04.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JQuery</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
// 모든 문서가 로드가 되면...
$(function(){
$(".btn1").on("click", function(){
let ts = $(this);
if(ts.text() == "숨김") {
// 1000은 1초를 의미.
$(".wrap").slideUp(1000, function(){
$(".btn1").text("노출");
})
}
else{
$(".wrap").slideDown(1000, function(){
$(".btn1").text("숨김");

})
}
});
});
</script>
</head>
<body>
<p class="btn-wrap">
<button class="btn1">숨김</button>
</p>
<div class="wrap">
<p class="txt1">내용1</p>
<p class="txt1">내용2</p>
</div>


</body>
</html>
  • 결과
  • 숨김 버튼을 누르면 텍스트가 사라지고 노출 버튼으로 전환
  • 노출 버튼을 누르면 텍스트가 출력되고 숨김 버튼으로 전환

Untitled

애니메이션 실습01

  • 버튼을 누름으로써 이동하는 객체를 구현해본다
  • jquery_05.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

<style>
*{
margin:0;
padding:0;
}
body{
padding: 20px;
}
.btn-wrap{
margin-bottom : 10px;
}
.wrap{
max-width:600px;
border : 1px solid black;
}
.txt1{
width:10%;
text-align: center;
background-color: aqua;
}
</style>
<script>
$(function(){
let txt1=$(".txt1");
let count = 1;
$(".btn-wrap button").on("click", function(){
let ts = $(this);
if(ts.hasClass("back-button")){
count--;

if(count < 1){
count = 1;
return;
}
txt1.animate({marginLeft:"-=10%"}, 500);
}
else{
count++;
if(count > 10){
count = 10;
return;
}
txt1.animate({marginLeft:"+=10%"}, 500);
}
});
});
</script>
</head>
<body>
<p class="btn-wrap">
<button class="back-button">back</button>
<button class="go-button">go</button>
</p>
<div class="wrap">
<p class="txt1">내용1</p>
</div>

</body>
</html>
  • 결과
  • back에 의해 뒤로, go에 의해 앞으로 이동한다

Untitled