혼공자 자동타입변환 형변환

자동타입변환 promotion

  • 프로그램 실행 도중에 자동적으로 타입 변환이 일어남

 

부모 타입 변수 = 자식 타입;

 

  • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있음
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이면 자동 타입 변환이 일어날 수 있음
  • 부모 타입으로 자동타입 변환된 이후 부모 클래스에 선언된 필드와 메소드만 접근 가능
  • 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스만 가능
  • 예외-> 메소드가 자식 클래스에서 재정의된 경우 자식 클래스의 메소드가 대신 호출됨

 

필드의 다형성

  • 다형성을 구현하기 위해서 부모타입으로 자동 타입 변환이 필요함
  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 잇음 -> 필드의 다형성
  • 객체들이 다른 객체로 교체 될 수 있어야 함
  • 자동 타입 변환을 이용해서 필드값을 교체함으로써 메소드를 수정하지 않아도 다양한 실행결과를 얻게 됨 -> 필드의 다형성

 

매개 변수의 다형성

  • 자동 타입 변환은 주로 메소드를 호출할 때 발생
  • 매소드 호출시 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만 매개값을 다양화 하기 위해 매개 변수에 자식 객체를 저장할 수도 있음
  • 매개 변수 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용 가능

 

강제 타입 변환 (casting)

  • 자식타입 변수 = (자식타입) 부모타입;
  • 자식타입이 부모 타입으로 자동 타입 변환 된 후 다시 자식 타입으로 변환할 때 사용
  • 자식에 선언된 필드와 메소드를 꼭 사용해야 할 때 강제 타입 변환을 해서 다시 자식 타입으로 변환 후 자식의 필드와 메소드 사용

 

객체 타입 확인 instanceof 연산자

  • 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 사용

 

boolean result = 좌항(객체) instanceof 우향(타입)

 

  • 매개값의 타입을 조사할 때 주로 사용
  • 메소드 내에서 강제 타입 변환이 필요한 경우 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환
  • 타입 확인 안하고 강제 타입 변환 시도시 ClassCastException 발생할 수 있음

 

확인문제

  • 자식 객체는 부모 타입으로 자동 타입 변환 된다 (o)
  • 부모 객체는 항상 자식 타입으로 강제 타입 변환 된다 (x)
  • 자동 타입 변환을 이용해서 필드와 매개 변수의 다형성을 구현한다. (o)
  • 강제 타입 변환 전에 instanceof 연산자로 변환 가능한지 검사하는 것이 좋다 (o)

 

혼자공부하는자바 패키지와 접근제한자

 

  • 패키지: 파일 시스템의 폴더 기능 + 클래스를 유일하게 만들어주는 식별자 
  • 패키지가 다르면 클래스 이름이 동일해도 다른 클래스로 인식

 

상위패키지.하위패키지.클래스

 

패키지 선언

package 상위패키지.하위패키지;

public class ClassName{ ... }
  • 패키지는 클래스의 일부
  • 패키지 이름
    • 숫자로 시작해서는 안되고 _, $를 제외한 특수 문자 사용 x
    • java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 x
    • 모두 소문자로 작성하는 것이 관례

 

import문

  • import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것을 컴파일러에게 알려줌

 

import 상위패키지.하위패키지.클래스이름;

import 상위패키지.하위패키지.*;

 

  • *를 이용해서 해당 패키지에 소속된 클래스들을 사용할 것을 알려줌
  • import문은 개수에 제한이 없음
  • 상위 패키지를 import했다고 하위까지 import되는 것은 아님

 

 

접근 제한자(Access Modifier)

  • public : 외부 클래스가 자요롭게 사용
  • protected: 같은 패키지 또는 자식 클래스에서 사용할수 있음
  • private: 외부에서 사용 x
  • default: 같은 패키지에 소속된 클래스에서만 사용

 

클래스의 접근 제한

//defalut 접근 제함

class 클래스 { ... }



//public 접근 제한

public class 클래스 { ... }

public 접근 제한

  • 클래스를 다른 개발자가 사용할수 있도록 라이브러리 클래스로 개발한다면 반드시 public 접근 제한을 갖도록 해야함
  • 인터넷으로 배포되는 라이브러리 클래스도 모두 public 접근 제한을 가지고 있음

 

생성자의 접근 제한

  • public 접근 제한: 모든 패키지에서 제한없이 생성자 호출
  • protected 접근 제한 : 같은 패키지에 속하는 클래스에서 생성자 호출 가능; 다른 패키지여도 해당 클래스의 자식클래스라면 생성자호출가능
  • default 접근 제한: 같은 패키지 내에 제한없이 생성자 호출 가능
  • private 접근 제한: 오직 클래스 내부에서만 생성자 호출하고 객체를 만들수 있음

 

필드와 메소드의 접근 제한

//필드 선언

[public | protected | private ] [static] 타입 필드;



/메소드 선언

[public | protected | private ] [static] 리턴 타입 메소드(..) { ... }

 

  • public : 제한 없음
  • protected: 다른 패키지에 속하는 클래스에서 필드와 메소드를 사용가능; 다른 패키지 클래스가 자식 클래스라명 사용 가능
  • default: 같은 패키지 제한 없고 다른패키지 x
  • private: 오직 클래스 내부에서만 사용

 

Getter와 Setter 메소드

  • 일반적으로 객체 지향 프로그래밍에서는 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막는다
  • 외부에서 마음대로 변경할 경우 객체의 무결성이 깨질 수 있기 때문
  • 메소드를 필드를 변경하는 방법을 선호
  • 필드는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 필드에 접근하도록 유도
  • 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있기 때문 -> Setter
  • 외부에서 객체의 데이터를 읽을 때도 메소드를 사용 -> Getter
  • 클래스를 선언할 때 가능하다면 필드를 private으로 선언해서 외부로부터 보호하고 필드에 대한 Setter와 Getter 메소드를 작성해서 필드값을 안전하게 변경/사용
  • Getter: 필드의 값을 외부로 리턴해주는 메소드
  • Setter: 외부에서 값을 받아 필드를 변경하는 메소드

 

Getter와 Setter

  • 외부에서 필드값 read only로 하려면 Getter 메소드만 선언 또는 Setter 메소드에 private 접근 제한 선언

 

 

확인문제

  • 접근 제한자는 클래스, 필드, 생성자, 메소드의 사용을 제한한다. (o)
  • public 접근 제한은 아무런 제한 없이 해당 요소를 사용할 수 있게 한다. (o)
  • default 접근 제한은 해다 클래스 내부에서만 사용을 허가한다. (x)
  • 외부에서 접근하지 못하도록 하려면 private 접근 제한을 해야 한다. (o)

 

 

 

 

 

 

자바의 정석 기초편

접근 제어자(access modifier)

  • private: 같은 클래스 내에서만 접근이 가능
  • (default): 같은 패키지 내에서만 접근이 가능
  • protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
  • public: 접근 제한이 전혀 없음
  • public > protected > (default) > private

 

캡슐화와 접근 제어자

 

 

  • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

class Time{
    private int hour; //0~23 사이의 값을 가져야 함.
    private int minute;
    private int second;


    public void setHour(int hour){
        if(isValidhour(hour)) return;
        this.hour = hour;
    }

    //매개 변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
    private boolean isValidhour(int hour){
        return hour <0 || hour >23;
    }

    public int getHour() { return hour; };
}


public class TimeTest {
    public static void main(String[] args) {
        Time t = new Time();
//        t.hour = -100;
        t.setHour(21); //hour의 값을 21로 변경
        System.out.println(t.getHour());
        t.setHour(100);
        System.out.println(t.getHour());

    }
}

 

  • 접근제어자의 범위는 최소화 시키는 것이 좋다

다형성(polymorphism)

  • 여러가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
  • 타입 불일치해도 괜찮다
  • 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이
  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음
  • 참조변수의 타입은 인스턴스의 타입과 일치하는 것이 보통이지만 일치 하지 않을 수도 있음
  • 참조변수가 조상타입일 때와 자손 타입일 때의 차이
    • 참조변수로 사용할 수 있는 멤버의 갯수가 달라짐
  • 자손타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음

 

참조변수의 형변환

  • 사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상 자손 관계의 참조변수는 서로 형변환 가능
  •  
public class Ex7_7 {
    public static void main(String[] args) {
        Car car = null;
        FireEngine fe = new FireEngine();
//        FireEngine fe2 = null; //car = (Car)fe; 에서 형변환이 생략됨

        FireEngine fe2 = (FireEngine)car; // 조상 -> 자손으로 형변환
        Car car2 = (Car)fe2;              // 자손 -> 조상으로 형변환
//        car2.drive(); //NullPointerException 발생.
//        fe.water();
//        fe2 = (FireEngine) fe; //자손타입 <- 조상타입, 형변환 생략 불가
//        fe2.water();
    }
}

class Car{
    String color;
    int door;

    void drive() {
        System.out.println("drive, Brrrr~~");
    }

    void stop() {
        System.out.println("stop!!");
    }
}

class FireEngine extends Car {
    FireEngine() {
    }

    void water() {
        System.out.println("water!!!");
    }
}



자바의 정석 기초편

패키지(package)

  • 서로 관련된 클래스의 묶음 (Java8 기준 약 4000개 클래스)
  • 클래스는 클래스 파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
  • 클래스의 실제 이름(full name)은 패키지를 포함(java.lang.String)
  • rt.jar는 클래스들을 압축한 파일 (rt = runtime)

 

패키지의 선언

  • 패키지는 소스파일의 첫번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다
  • 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다

 

클래스 패스(classpath)

  • 클래스 파일(*.class)의 위치를 알려주는 경로 (path)
  • 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
  • classpath(환경변수)에 패키지의 루트를 등록해줘야 함

 

import문

  • 클래스를 사용할 때 패키지 이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다
  • java.lang(자바의 기본패키지)의 클래스는 Import하지 않고도 사용할 수 있다.
    • String, Object, System, Thread ...

 

import문의 선언

  • import문을 선언하는 방법
    • import 패키지명.클래스명;
    • import 패키지명.*;
  • imprt문은 패키지문과 클래스 선언 사이에 선언

import문의 선언

  • 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지 명을 붙여줘야 한다

 

static import문

  • static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다

static import문

 제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 접근 제어자 public, protected, (default), private
  • 그 외: static, final, abstract, native, transient, synchronized, volatiled, strictfp
  • 하나의 대상에 여러 제어자를 같이 사용 가능(접근제어자는 하나만)

 

static -클래스의, 공통적인

 

static

 

final - 마지막의, 변경될 수 없는

  • 부모가 될 수 없는 마지막 클래스 final

final

 

abstract - 추상의, 미완성의

  • 미완성 설계도 -> 제품생산불가
  • 추상클래스를 상속받아서 완전한 클래스로 만들고 객체 생성가능

abstract

 

자바의 정석 상속

상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것

 

class Parent{}
class Child extends Parent{
...
}
  • 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다(같거나 많다)

상속

  • 자손의 변경은 조상에 영향을 미치지 않는다.

 

 

포함 관계 

 

  • composite(포함): 클래스의 멤버로 참조변수를 선언하는 것
  • 상속관계 '~은 ~이다.(is-a)'
  • 포함관계 '~은 ~을 가지고 있다.(has-a)' ->대부분 포함관계를 씀

 

클래스 간의 관계 설정하기

class MyPoint{
    int x;
    int y;
}

//class Circle extends MyPoint { //상속
//    int r;
//}

class Circle {
    MyPoint p = new MyPoint();
    int r;
}


public class InheritanceTest {
    public static void main(String[] args) {

        Circle c = new Circle();
        c.p.x =1;
        c.p.y =2;
        c.r = 3;
        System.out.println("c.p.x="+c.p.x);
        System.out.println("c.p.y="+c.p.y);
        System.out.println("c.r="+c.r);
    }

}

 

단일 상속(Single Inheritance)

  • Java는 단일 상속만을 허용한다.
  • 조상은 하나만!
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

Object클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
  • 모든 클래스는 Object에 정의된 11개의 메서드를 상속받는다 (toString(), equals(), hashCode(),...)

 

public class InheritanceTest {
    public static void main(String[] args) {

        Circle c = new Circle();
        System.out.println(c.toString()); //Circle@340f438e
        Circle c2 = new Circle();
        System.out.println(c2.toString()); //Circle@30c7da1e
    }

}
  • toString()을 안써도 똑같이 출력된다.
  • println()의 기능

 

오버라이딩(overriding)

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
  • 선언부는 변경 불가, 내용만 변경가능

오버라이딩

class Point {
    int x;
    int y;
    String getLocation(){
        return "x: "+ x + ", y:" +y;
    }
}

class MyPoint3 extends Point {
    int z;
    //조상의 getLocation()을 오버라이딩
    String getLocation(){
        return "x: "+ x + ", y:" +y+" ,z:"+z;
    }

}

public class OverrideTest {
    public static void main(String[] args) {
        MyPoint3 p = new MyPoint3();
        p.x = 3;
        p.y =5;
        p.z =7;
        System.out.println(p.getLocation());
    }
}

 

오버라이딩의 조건

  • 선언부가 조상 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

오버로딩 vs 오버라이딩

근본적으로 관계 없음

overloading : 기존에 없는 새로운 메서드를 정의하는 것 (new)

overriding: 상속받은 메서드의 내용을 변경하는 것 

 

 

참조변수 super

  • 객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자)내에만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화

조상의 생성자

  • 클래스 이름 대신 super를 사용
  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
  • 그렇지 않으면 생성자의 첫 줄에 super();를 삽입한다.(조상의 기본 생성자)

 

 

혼공자 자바 java

메소드 선언부 method signiture

  • 리턴 타입: 메소드가 리턴하는 결과의 타입 푷시
  • 메소드 이름: 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어준다
  • 매개 변수 선언: 메소드를 실행할 때 데이터를 받기 위한 변수를 선언
  • 메소드 실행 블록: 실행할 코드를 작성

 

메소드 선언

  • 메소드 선언은 선언부와 실행 블록으로 구성

 

리턴 타입

  • 리턴값의 타입 == 실행한 후의 결과값
  • 메소드는 리턴값이 있을 수도 있고 없을 수도 있으나 리턴값이 있을 경우 리턴 타입이 선언부에 명시되어야 함

 

메소드 이름

  • 숫자로 시작하면 안되고 $와_를 제외한 특수문자 사용 금지
  • 관례적으로 메소드 이름은 소문자로 작성
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성

 

매개 변수 선언

  • 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용

 

매개 변수의 개수를 모를 경우

  • 매개 변수를 배열 타입으로 선언하는 것
int sum1(int[] values){ }
int sum2(int ...values) { }

 

리턴문

  • 리턴값이 있는 메소드
  • return 리턴값;
  • return문이 없다면 컴파일 에러가 발생
  • return문이 실행되면 메소드는 즉시 종료

 

리턴값이 없는 메소드:void

  • void로 선언된 메소드에서 return은 메소드 실행을 강제 종료 시키는 역할을 함

 

메소드 호출

  • 메소드는 클래스 내.왜부의 호출에 의해 실행됨
  • 클래스 내부의 다른 메소드에서 호출할 경우 단순한 메소드 이름으로 호출하면 되지만
  • 클래스 외부에서 호출할 경우, 클래스로부터 객체를 생성한 뒤 참조변수를 이요해서 메소드를 호출해야함
  • 객체가 존재해야 메소드도 존재하기 때문

 

객체 내부에서 호출

메소드(매개값, ...);
타입 변수 = 메소드(매개값, ...);

 

객체 외부에서 호출

  • 외부 클래스에서 메소드를 호출하려면 클래스로부터 객체를 생성해야함
  • 메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문
클래스 참조변수 = new 클래스 (매개값,..);

 

  • 객체가 생성되었다면 참조 변수와 함께 도트(.) 연산자를 사용해서 메소드를 호출

참조변수.메소드(매개값, ...);
타입 변수 = 참조변수.메소드(매개값, ...);

 

메소드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것
  • 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함
  • 매개값을 다양하게 받아 처리 할 수 있음
  • 이름만 다르다고 해서 오버로딩이 아님

 

확인 문제

  • 리턴값이 없는 메소드는 리턴 타입을 void로 해야한다.
  • 리턴 타입이 있는 메소드는 리턴값을 지정하기 위해 반드시 return문이 있어야한다
  • 매개값의 개수를 모를 경우 ... 를 이용해서 매개 변수를 선언할 수 있다.
  • 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 한다.

 

메소드 오버로딩에 대한 설명으로 맞는 것에 O/X

  • 동일한 이름의 메소드를 여러개 선언 하는 것을 말한다. (o)
  • 반드시 리턴 타입이 달라야 한다. (x)
  • 매개 변수의 타입, 개수, 순서를 다르게 선언해야 한다.(o)
  • 매개 값을 타입 및 개수에 따라 호출될 메소드가 선택된다 (o)

 

MemberService

public class MemberService {
    boolean login(String id, String password) {
        if (id.equals("hong") && password.equals("12345")) {
            return true;
        } else {
            return false;
        }
    }

    void logout(String id){
        System.out.println("로그아웃 되었습니다.");
    }
}

 

 

혼공자

생성자 constructor

new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당

 

객체 초기화

  • 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것
  • new 연산자에 의해 생성자가 실행되면 힙 영역에 객체가 생성되고 객체의 번지 리턴
  • 리턴된 객체의 번지는 클래스 변수에 저장

 

기본 생성자 default constructor

[public] 클래스() {}
  • 클래스가 public class로 선언되면 기본 생성자에도 public이 붙지만 클래스가 public 없이 선언되면 기본 생성자에도 public 없음

 

생성자 선언

클래스( 매개변수선언, ....){  객체 초기화 코드}

 

  • 리턴 타입이 없고 클래스 이름과 동일
  • 블록 내부에 객체 초기화 코드가 작성됨
  • 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용전에 필요한 준비를 함
  • 매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 함

 

 

필드 초기화

  • 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됨
  • 초기화하는 방법
  • 필드를 선언할 때 초기값을 주는 방법
  • 생성자에게 초기값을 주는 방법

 

생성자 오버로딩

  • 매개변수를 달리하는 생성자를 여러개 선언하는 것

 

다른 생성자 호출: this()

  • 생성자에서 다른 생성차를 호출할 때 this()코드를 사용
  • 생성자의 첫 줄에서만 허용
  • this()의 매개값은 호출되는 생성자의 매개 변수에 맞게 제공해야 함
  • this() 다음에는 추가적인 실행문들이 올 수 있음
  • 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 진행

 

확인 문제

  • 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다. (x)
  • 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다. (o)
  • 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다. (o)
  • 매개 변수의 수, 타입, 순서가 다른 생성자를 여러 개 선언할 수 있다. (o)

 

 

Member 클래스 작성

public class Member {
    
    String name;
    String id;
    
    public Member(String name, String id){
        this.name = name;
        this.id = id;
    }
}

 

Board 클래스 작성

public class Board {
    
    String title;
    String content;
    String writer;
    String date;
    int hitcount;
    
    Board(String title, String content, String writer, String date, int hitcount){
        this.title = title;
        this.content = content;
        this.writer = writer;
        this.date =date;
        this.hitcount = hitcount;
    }
    
    Board(String title, String content){
        this(title, content, "로그인한 회원아이디", "현재 컴퓨터 날짜", 0);
    }
    
    Board(String title, String content, String writer){
        this(title, content,writer,"현재 컴퓨터 날짜", 0);
    }
    
    Board(String title, String content, String writer, String date){
        this(title, content,writer,date,0);
    }
    
}

 

문제설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 사항

x는 1 이상, 10000 이하인 정수입니다.

 

문제 풀이

1. int x 값을 String 타입으로 바꾼후 .split()을 이용해서 배열로 만든다.

2. 각 인덱스 값을 더해준다. -> int sum 

3. x를 sum으로 나눈 나머지가 ==0 이면 true, 아니면 false 를 리턴한다.

public class harshadNumber {
    public boolean solution(int x) {
        boolean answer = true;

        String num = String.valueOf(x);
        String[] numbers = num.split("");

        int sum =0;

        for (String number : numbers) {
            sum += Integer.parseInt(number);
        }
        
        if(x%sum==0){
            return answer;
        } else{
            answer=false;
            return answer;
        }

    }

    public static void main(String[] args) {
        harshadNumber method = new harshadNumber();
        System.out.println(method.solution(18));
    }
}

처음에 기본 for문을 사용했다가 향상된 for문을 사용해봤습니다.

훨씬 편하네요. 

오늘 오전에 언어 스터디를 했는데 조원분이 너무 멋진 객체지향 예제(보러가보세요!)를 보여주셔서 자극을 받아 바로 만들어 봅니다. 저는 식당 메뉴 별로 가격을 정하고 판매량 입력 후 매출 정산하는 프로그램을 만들어 보려고 합니다.

 

객체지향 예제

필드 선언

public class restaurantRevenue {
    //필드 선언
    private int price;
    private int revenue;
    private String menu;

    private int sold;

    //기본 생성자

    restaurantRevenue () {}



    //매개변수를 가진 생성자
    public restaurantRevenue(String menu, int price, int sold, int revenue) {
        this.menu = menu;
        this.price = price;
        this.sold = sold;
        this.revenue = revenue;
    }

    // getter setter 단축키 cmmd + N
    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getRevenue() {
        return revenue;
    }

    public void setRevenue(int revenue) {
        this.revenue = revenue;
    }

    public int getSold() {
        return sold;
    }

    public void setSold(int sold) {
        this.sold = sold;
    }

    public String getMenu() {
        return menu;
    }

    public void setMenu(String menu) {
        this.menu = menu;
    }
}

 

 

메뉴 입력 프로그램 만들기

import java.util.Scanner;

public class revenueExample {
    private Scanner scanner = new Scanner(System.in);

    private restaurantRevenue newMenu = null; //새 메뉴가 저장될 객체

    public revenueExample (){}; //기본 생성자

    public void display() { //메뉴화면 메소드

        int option = 0;

        do {
            System.out.println("=====*메뉴입력하기*=====");
            System.out.println("1. 메뉴입력");
            System.out.println("2. 판매량입력");
            System.out.println("3. 매출보기");
            System.out.println("0. 종료하기");
            System.out.print("선택>>");



            option = scanner.nextInt();

            switch (option) {
                case 1:
                    System.out.println(entermenu());
                    break;
                case 2:
                    System.out.println(sold());
                    break;
                case 3:
                    System.out.println(revenue());
                    break;
                case 0:
                    System.out.println("프로그램 종료!");
                    break;
                default:
                    System.out.println("다시 입력해주세요 -_-^");
            }


        }


        while (option != 0);
    }
    public String entermenu(){ //메뉴입력하기
        System.out.println("=====메뉴입력=====");
        System.out.print("메뉴명> ");
        String menu = scanner.next();
        System.out.print("가격> ");
        int price = scanner.nextInt();

        newMenu = new restaurantRevenue(menu, price,0,0);

        return "메뉴명:"+menu+" 가격: "+price+"원";
    }

    public String sold(){
        System.out.println("=====판매량입력=====");
        System.out.print("메뉴명> ");
        String menu = scanner.next();
        System.out.print("판매량> ");
        int sold = scanner.nextInt();

        if(menu.equals((newMenu.getMenu()))){
            newMenu = new restaurantRevenue(menu, newMenu.getPrice(), sold, sold* newMenu.getPrice());
            return "메뉴명: "+ menu + " 판매량: "+sold;
        }else {
            return "메뉴정보가 없습니다.";
        }


    }

    public String revenue(){
        System.out.println("=====매출보기=====");
        System.out.print("메뉴명> ");
        String menu = scanner.next();

        if(menu.equals((newMenu.getMenu()))) {
            return "메뉴명 " + menu + " 매출: " + newMenu.getRevenue();
        } else{
            return "메뉴정보가 없습니다.";
        }

    }

    public static void main(String[] args) {
        revenueExample revenue = new revenueExample();
        revenue.display();
    }

}


 

 

결과

=====*메뉴입력하기*=====
1. 메뉴입력
2. 판매량입력
3. 매출보기
0. 종료하기
선택>>1
=====메뉴입력=====
메뉴명> pasta
가격> 25000
메뉴명:pasta 가격: 25000원
=====*메뉴입력하기*=====
1. 메뉴입력
2. 판매량입력
3. 매출보기
0. 종료하기
선택>>2
=====판매량입력=====
메뉴명> pasta
판매량> 12
메뉴명: pasta 판매량: 12
=====*메뉴입력하기*=====
1. 메뉴입력
2. 판매량입력
3. 매출보기
0. 종료하기
선택>>3
=====매출보기=====
메뉴명> pasta
메뉴명 pasta 매출: 300000
=====*메뉴입력하기*=====
1. 메뉴입력
2. 판매량입력
3. 매출보기
0. 종료하기
선택>>2
=====판매량입력=====
메뉴명> rice
판매량> 40
메뉴정보가 없습니다.
=====*메뉴입력하기*=====
1. 메뉴입력
2. 판매량입력
3. 매출보기
0. 종료하기
선택>>3
=====매출보기=====
메뉴명> risotto
메뉴정보가 없습니다.
=====*메뉴입력하기*=====
1. 메뉴입력
2. 판매량입력
3. 매출보기
0. 종료하기
선택>>0
프로그램 종료!

Process finished with exit code 0

 

매우 간단하지만 굿 실습이었습니다.

혼자 공부하는 자바

 

필드

객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳

 

필드 선언

  • {} 블록에 존재
  • 위치는 상관 없음
  • 단, 생성자와 메소드 중괄호 {} 내부에는 선언 될 수 없음
  • 생성자와 메소드 중괄호 블록 내부에 선언된 것은 모두 로컬 변수
  • 타입 필드 [=초깃값];
  • 선언형태는 변수와 피슷하지만 필드는 변수가 아님
  • 초기값이 저장되지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정됨
  • 참조 타입은 객체를 참조하고 있지 않은 상태인 null로 초기화

 

필드 사용

  • 필드값을 읽고 변경하는 작업
  • 클래스 내부의 생성자나 메소드에서 사용할 경우 필드 이름으로 일고 변경하면 됨
  • 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용
  • 필드가 객체에 소속된 데이터이므로 객체가 있어야 필드도 존재함
  • 변수가 객체를 참조하게 되면 도트(.) 연산자를 사용해서 필드에 접근
  • 도트(.)연산자는 객체 접근 연산자

 

확인 문제

  • 필드는 메소드에서 사용할 수 있다. (o)
  • 필드는 클래스 블록 어디서든 선언할 수 있다(생성자, 메소드 내부 제외) (o)
  • 필드는 객체 외부에서 접근할 수 없다. (x)
  • 필드는 초기값을 주지 않더라도 기본값으로 자동 초기화 된다. (o)

 

Member Class 선언하기

public class Member {

    String name;
    String id;
    String password;
    int age;

    public static void main(String[] args) {
        Member member = new Member();
        member.name = "최하얀";
        member.age =23;

        System.out.println("이름: "+member.name);
        System.out.println("나이: "+member.age);
    }
}

필드 선언 연습

 

 

정수 제곱근 판별

 

문제 설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

 

제한 사항

n은 1이상, 50000000000000 이하인 양의 정수입니다.

 

문제 풀이

if else문을 사용하면 될 것 같습니다...?

 

1.  x*x == n 이면 (x+1)*(x+1) 을 리턴하고 else -1을 리턴한다.

2. sqrt(n) = x 

 

public class Squareroot {
    public long solution(long n) {
        long answer = 0;
        long x = 0;
        x = (long) Math.sqrt(n);
        if(x*x ==n){
            answer = (x+1)*(x+1);
        } else {
            answer = -1;
        }
        return answer;
    }

    public static void main(String[] args) {
        Squareroot method = new Squareroot();
        System.out.println(method.solution(121));
    }
}

 

 

정수 내림차순으로 배치하기

문제 설명

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

 

제한 사항

n은 1이상 8000000000 이하인 자연수입니다.

 

문제 풀이

Arrays.sort() 사용하면 되겠다~😎

근데 얘는 오름차순으로 배열하는 메서드이니까 for문을 사용해서 다시 배열 해주자.

1. 문자열로 전환하기 String.valueOf() 메서드 사용

2. split() 메서드 사용해서 나눈 값으로 배열 만들기

3. Arrays.sort() 사용해서 오름차순으로 배열하기

4. for문을 사용해서 내림차순으로 배열하기

5. long 타입으로 변환해서 answer에 저장하기

 

import java.util.Arrays;

public class descendingOrder {

        public long solution(long n) {
            long answer = 0;
            String str = String.valueOf(n);         //String 타입 변환
            String[] nums = str.split("");          //String 배열 만들기
            Arrays.sort(nums); //[1,1,2,3,7,8]      //오름차순으로 정렬하기
            long[] num = new long[nums.length];
            for(int i=0; i<nums.length; i++){       //내림차순으로 정렬하기
                num[i]= Long.parseLong(nums[nums.length-1-i]);
            }

            String almostanswer = "";     //거의 다왔어요! String으로 만들었다가
            for(int i=0; i<num.length;i++){
                almostanswer += num[i];
            }
            answer = Long.parseLong(almostanswer); //Long 타입으로 변환하기!
            return answer;
        }


    public static void main(String[] args) {
        descendingOrder method = new descendingOrder();
        System.out.println(method.solution(118372));
    }
}

 

 

자바의 정석 배열

배열

 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

 

배열의 선언과 생성

배열의 선언 - 배열을 다루기 위한 참조변수 선언

 

1. 타입[] 변수이름

 - Int[] score;

 - score = new int[5];

 

2. 타입 변수이름[]

 

배열의 인덱스

각 요소에 자동으로 붙는 번호

"인덱스(Index)의 범위는 0부터 배열길이-1"까지

public class Ex5_1_tmp {
    public static void main(String[] args) {
//        int[] score; 1. 배열 score를 선언(참조변수)
//        score = new int[5]; 2. 배열의 생성(int저장공간 x 5)
        
        int [] score = new int[5]; // 배열의 선언과 생성을 동시에
        score[3] =100;
        
    }

배열의 길이

"배열은 한번 생성하면 그 길이를 바꿀 수 없다."

 

배열의 초기화

배열의 각 요소에 처음으로 값을 저장하는 것

 

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

 

배열의 출력

char[] ChArr 

 

캐릭터 배여일 때만 출력 가능

 

// 배열의 요소를 순서대로 하나씩 출력

for( int i=0; i<Arr.length; i++){

System.out.println(Arr[i]);}

 

//배열의 모든 요소를 출력

System.out.println(Arrays.toString(Arr));

 

 

배열의 활용

총점과 평균 구하기

public class Ex5_2 {
    public static void main(String[] args) {
        int sum=0;
        float average =-0f;

        int[] score = {100,88,100,100,90};
        for (int i=0; i <score.length; i++){
            sum += score[i];
        }
        average = sum /score.length; //계산결과를 Float으로 얻기

        System.out.println("총점 : " + sum);
        System.out.println("평균 : " + average);
    }
}

 

최대값과 최소값

 

public class Ex5_3 {
    public static void main(String[] args) {
        int[] score = {79, 88, 91, 33, 100, 55,95};

        int max = score[0];
        int min = score[0];

        for(int i=1; i <score.length; i++) {
            if(score[i]> max){
                max = score[i];
            } else if(score[i]<min){
                min = score[i];
            }
        }
        System.out.println("최대값 :"+max);
        System.out.println("최소값 :"+min);
    }
}

 

섞기(Shuffle)

import java.util.Arrays;

public class Ex5_4 {
    public static void main(String[] args) {
        int[] numArr = {0,1,2,3,4,5,6,7,8,9};
        System.out.println(Arrays.toString(numArr));

        for (int i =0; i<100; i++){
            int n = (int)(Math.random()*10);
            int tmp = numArr[0];
            numArr[0] = numArr[n];
            numArr[n] =tmp;
        }
        System.out.println(Arrays.toString(numArr));
    }
}

 

로또 번호 

import java.util.Arrays;

public class Ex5_5 {
    public static void main(String[] args) {
        int[] ball = new int[45]; //45개 정수값을 저장하기

        //배열의 각 요소에 1~45값을 저장
        for(int i=0; i<ball.length; i++){
            ball[i]=i+1; // ball[0]에 1이 저장된다.인덱스는 0부터 시작하니까
        }
        System.out.println(Arrays.toString(ball));
        int tmp =0; // 두 값을 바꾸는데 사용할 임시변수
        int j =0; // 임의의 값을 얻어서 저장할 변수

        // 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 저장
        // 0번째부터 5번째 요소까지 모두 6개만 바꾼다.
        for (int i=0; i<6; i++){
            j=(int)(Math.random()*45); //0~44범위 임의의 수
            tmp =ball[i];
            ball[i] = ball[j];
            ball[j] = tmp;
            System.out.println(Arrays.toString(ball));
        }
        //배열 ball의 앞에서부터 6개의 요소를 출력한다.
        for(int i=0; i<6; i++){
            System.out.printf("ball[%d]=%d%n", i, ball[i]);
        }

    }
}

결과

[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]
[12, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 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]
[12, 7, 3, 4, 5, 6, 2, 8, 9, 10, 11, 1, 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]
[12, 7, 28, 4, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 5, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 27, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 27, 6, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 5, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
[12, 7, 28, 24, 6, 27, 2, 8, 9, 10, 11, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 4, 25, 26, 5, 3, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
ball[0]=12
ball[1]=7
ball[2]=28
ball[3]=24
ball[4]=6
ball[5]=27

Process finished with exit code 0

 

 

String 배열의 선언과 생성

String 클래스

1. String클래스는 char[] 와 메서드(기능)를 결합한 것

   String클래스 = char[] + 메서드(기능)

 

2. String 클래스는 내용을 변경할 수 없다. (read only)

 

String클래스의 주요 메서드

char charAt(int index) : 문자열에서 해당위치(index)에 있는 문자를 반환한다.

int length() : 문자열의 길이를 반환한다

String substring (in from, int to) : 문자열에서 해당 범위(from~to)의 문자열을 반환한다 (to 는 포함 안됨)

boolean equals(Object obj): 문자열의 내용이 같은지 확인한다.

char[] toCharArray(): 문자열을 문자배열로 변환해서 반환

 

 

커맨드 라인을 통해 입력받기

public class Ex5_7 {
    public static void main(String[] args) {
        System.out.println("매개변수의 개수:"+args.length);
        for(int i=0; i< args.length;i++){
            System.out.println("args["+i+"] = \""+ args[i] +"\"");
        }
    }
}

run configuration

run configuration의 arguments를 수정해주면,,,,

 

 

2차원 배열

테이블 형태의 데이터를 저장하기 위한 배열

 

int[][] score = new int[4][3]; //4행 3열의 2차원 배열 score

2차원 배열의 인덱스

2차원 배열의 초기화

int[][] arr = {

                        {1,2,3}

                        {4,5,6}

                     };

 

 

2차원 배열 예제

class Ex5_8 {
   public static void main(String[] args) {
      int[][] score = {
              { 100, 100, 100 }
            , { 20, 20, 20 }
            , { 30, 30, 30 }
            , { 40, 40, 40 }
      };
      int sum = 0;

      for (int i = 0; i < score.length; i++) {
         for (int j = 0; j < score[i].length; j++) {
            System.out.printf("score[%d][%d]=%d%n", i, j, score[i][j]);

            sum += score[i][j];
         }
      }

      System.out.println("sum=" + sum);
   }
}
class Ex5_9 {
    public static void main(String[] args) {
        int[][] score = {
                { 100, 100, 100}
                , { 20, 20, 20}
                , { 30, 30, 30}
                , { 40, 40, 40}
                , { 50, 50, 50}
        };
        // 과목별 총점
        int korTotal = 0, engTotal = 0, mathTotal = 0;

        System.out.println("번호 국어 영어 수학 총점 평균");
        System.out.println("=============================");

        for(int i=0;i < score.length;i++) {
            int  sum = 0;      // 개인별 총점
            float avg = 0.0f;  // 개인별 평균

            korTotal  += score[i][0];
            engTotal  += score[i][1];
            mathTotal += score[i][2];
            System.out.printf("%3d", i+1);

            for(int j=0;j < score[i].length;j++) {
                sum += score[i][j];
                System.out.printf("%5d", score[i][j]);
            }

            avg = sum/(float)score[i].length;  // 평균
            System.out.printf("%5d %5.1f%n", sum, avg);
        }

        System.out.println("=============================");
        System.out.printf("총점:%3d %4d %4d%n", korTotal, engTotal, mathTotal);
    }
}
import java.util.Scanner;

class Ex5_10{
    public static void main(String[] args) {
        String[][] words = {
                {"chair","의자"},        // words[0][0], words[0][1]
                {"computer","컴퓨터"},    // words[1][0], words[1][1]
                {"integer","정수"}       // words[2][0], words[2][1]
        };

        Scanner scanner = new Scanner(System.in);

        for(int i=0;i<words.length;i++) {
            System.out.printf("Q%d. %s의 뜻은?", i+1, words[i][0]);

            String tmp = scanner.nextLine();

            if(tmp.equals(words[i][1])) {
                System.out.printf("정답입니다.%n%n");//%n은 개행
            } else {
                System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n",words[i][1]);
            }
        } // for
    } // main의 끝
}

 

Arrays로 배열 다루기

문자열의 비교와 출력 - equals(), toString()

 

Arrays.toString(arr); 1차원 배열

Arrays.deepToString(arr2D); 2차원 배열

 

Arrays.equlas(arr1, arr2); 1차원배열 비교

Arrays.deepEquals(arr1, arr2); 2차원 이상 배열 비교

 

배열의 복사 - copyOf(), copyOfRange()

 

배열의 정렬 - sort()

 

Arrays.sort(arr); // 오름차순으로정렬

 

 

 

 

 

이번주 월요일에 정식으로 부트캠프를 시작했고 벌써 첫번째 주의 마지막날이 되었습니다. 월요일에는 아무것도 모르는 백지상태에 가까웠다면, 이제는 JWT를 이용해서 회원가입, 로그인, 로그아웃을 구현할줄 알게 되었고, Github을 이용해서 팀 프로젝트를 완성했습니다. Rest API 형식을 따라서 API 설계도 해보고 MongoDB를 이용해서 DB 설계도 경험했습니다. flask의 Blueprint를 사용해서 효율적으로 분업을 했고 후에 merge할 때 충돌이 한번도 발생하지 않았습니다. 

항해99 1주차 회고

JWT를 활용한 로그인, 로그아웃, 회원가입 구현

  • JWT을 사용하는 이유
    • 쿠키를 받아 토큰을 발급해서 로그인 정보 확인
    • 쿠키는 브라우저에만 존재
    • 같은 도메인이면 쿠키가 유지됨
    • 로그아웃 하려면 쿠키 삭제하면 됨
    • 보안상 더 낫다고 함
  • Hash 함수 사용 이유
    • 비밀번호의 암호화
    • Sha 256, Sha 512 를 많이 사용함
  • unix time: 1970년 1월 1일로부터 몇 초 지났는지

TIL 221114

 

TIL 부트캠프 정식 시작 JWT 로그인 구현하기 221114

드디어 오늘이 항해99 부트캠프 정식 시작일입니다. 지난주는 pre-onboarding 기간으로 주특기 언어인 Java를 공부하는 시간을 가졌습니다. 오늘부터 새로 배정된 조에서 미니 프로젝트를 진행합니다

pizzathedeveloper.tistory.com

 

아이디 중복확인

function id_overlap_check() {
    let userid = $('#user_id').val()
    if (userid == '') {
        alert('아이디를 입력해주세요.'); //공백인 경우
    } else {
        $.ajax({
            type: "GET",
            url: "/join/check?user_id=" + userid, //get 할 때 url은 "/url"+찾는값
            data: {},
            success: function (response) {
                alert(response['message']);
                if (response['success'] == false) {
                    let input = document.getElementById("user_id");
                    input.value = null; //input 값 없앰
                } else{$('.user_id').attr("check_result", "success");
                    $('.id_overlap_button').hide(); //중복확인버튼 없앰
                         }
                }
        });
    }
}

 

중복확인 필수로 하지 않으면 회원 가입이 되지 않게 만들기

 

.attr () 메소드를 이용해서 확인 되면 =="success" 로 변경이 되게 구현했습니다.

function join() {
    if ($('.user_id').attr("check_result") == "fail") {
        alert("아이디 중복체크를 해주시기 바랍니다.") //중복체크가 안되어 있을 때
    }
    else if ($('.name_input').val() == '') {
        alert("닉네임을 입력해주시기 바랍니다."); //닉네임 input 이 없을때
        $('.user_name').focus();
    } else if ($('.pw_input').val() == '') {
        alert('비밀번호를 입력해주세요.')
        $('.user_pw').focus(); //pw input이 공백인 경우
    } else {
        $.ajax({
            type: "POST",
            url: "/join/join",
            data: {
                id_give: $('#user_id').val(),
                pw_give: $('#user_pw').val(),
                name_give: $('#user_name').val()
            },
            success: function (response) {
                if (response['result'] == 'success') {
                    alert('회원가입이 완료되었습니다.')
                    window.location.href = '/login'
                } else {
                    alert('다시 시도하세요.')
                }
            }
        })
    }}
 

TIL 221116

 

TIL Merge 하고 다시 작업하기 아이디 중복확인 기능 로그인 JWT token 221116

오늘은 아침에 일어나는 게 너무 힘들었는데 막상 또 일어나서 컴퓨터 앞에 앉으니까 열정이 샘솟았습니다. 제가 어제 걱정하고 씨름했던 오류가 말끔히 해결이 되었거든요. 껐다 켰다는 진리

pizzathedeveloper.tistory.com

 

로그아웃 기능 구현하기

JWT 를 브라우저에서 지워주면 됩니다.

토큰은 클라이언트에서 저장하기 때문입니다.

jquery를 사용했습니다.

 

$.removeCookie('쿠키이름');

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script> //필요한 페이지에 이거 복붙해주세요.
    <title>logout</title>
    <script>
        function logout(){
        $.removeCookie('mytoken');
        alert('로그아웃!')
        window.location.href='/login'
      } //로그아웃 버튼 만들어서 붙이시면 됩니다
    </script>
</head>
<body>

<button onclick="logout()">로그아웃 하기</button>
</body>
</html>

 

미니프로젝트 '제2의 항해 매니저' github

https://github.com/sooni2/HanghaeManager

 

GitHub - sooni2/HanghaeManager

Contribute to sooni2/HanghaeManager development by creating an account on GitHub.

github.com

제 리포지토리에 올린 첫 프로젝트입니다.

뛰어난 조원분들과 함께해서 제가 기여한 부분이 메인은 아니지만 나름 맡은 역할을 다 했습니다.

제가 기획한 프로젝트가 채택되어서 기획쪽도 재미가 있다고 생각했습니다.

늘 저는 아이디어는 많습니다.

 

 

첫 코드리뷰를 진행하다

오늘은 함께 첫 프로젝트를 진행한 조원들과 함께 코드리뷰를 진행했습니다. 

 

- 백에서 할수 있는 것은 최대한 백에서 처리하기

- API 설계를 아는 것이 중요하다

- 이번 프로젝트에는 Rest API 를 사용했음

- DB 설계에 맞춰 API 설계하기

 

저는 이번주에 시작한 완전 초짜지만 먼저 시작한 선배님들의 조언과 여러 피드백을 들으면서 월요일보다 성장한 것 같습니다. 함께한 조원분들이 성격도 좋고 개발도 잘해서 다행이었던 프로젝트였습니다. 

 

다음 주에는...

이제는 자바스크립트를 뒤로 하고 자바에 집중하는 한주가 될 예정입니다. 오늘은 남궁성 자바의 정석 ch 5까지 들었습니다. 프로그래머스 알고리즘 문제를 지난 이틀간 풀었는데 아무래도 자바 기초가 부족하다 보니 간단한 문제도 방법을 몰라서 푸는 경우가 많았습니다. 문제 푸는 로직은 어느정도 이해는 갑니다. 더 많은 메소드를 알게 되면 알고리즘 문제 풀이가 좀 더 수월할 것 같습니다. 

 

시그마로 푸는 문제가 하나 있었는데 언제 이걸 봤었지 했는데 고등학생인가 대학생때 통계학에서 배운 기억이 났습니다. 알고리즘 주차에 걷기반을 선택해서 28 문제를 푸는 것이 학습 목표인데 좀더 욕심을 내서 달리기 반의 문제 10개까지 추가를 해서 풀어보도록 하겠습니다.

 

 

조건문과 반복문

 

조건문과 반복문 flow control statement(제어문)

조건식

If-else if 문

여러 개 중의 하나 - 여러 개의 조건식을 포함한 조건식

 

중첩 if 문

중첩횟수 제약은 없음

괄호가 중요,,!

 

Switch문

처리해야 하는 경우의 수가 많을 때 유용한 조건문

break문을 빼먹지 말자

 

1. 조건식을 계산한다.

2. 조건식의 결과와 일치하는 case문으로 이동한다.

3. 이후의 문장들을 수행한다.

4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.

 

Switch문의 제약조건

1. switch문의 조건식 결과는 정수 또는 문자열(1.7 버전이후)이어야 한다.

2. case문의 값은 정수, 상수(문자포함), 문자열만 가능하며, 중복되지 않아야 한다.

 

임의의 정수 만들기

Math.random() - 0.0과 1.0사이의 임의의 double값을 반환

 

0.0 <= Math.random() < 1.0

 

1과 3사이의 정수 구하기

1. 각 변에 3을 곱한다.

 

2. 각 변을 Int형으로 변환한다.

 

3. 각 변에 1을 더한다.

 

System.out.println((int)(Math.random()*11)-5);//-5와 5의 사이

 

for문

조건을 만족하는 동안 블럭{}을 반복 - 반복 횟수를 알 때 적합

변수의 범위(scope)는 좁을수록 좋다; 선언위치부터 선언된 블럭의 끝까지

 

//조건식을 생력하면, true로 간주되엇 무한반복문이 된다.
for(;;){
    System.out.println("i="+1);
}

중첩 for 문

직사각형 별찍기

public class Ex4_15 {
    public static void main(String[] args) {
        for(int i=1; i<=5; i++) {
            for (int j = 1; j <= 10; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

별 늘리기

public class Ex4_15 {
    public static void main(String[] args) {
        for(int i=1; i<=5; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

 

while문

조건을 만족시키는 동안 블럭{}을 반복 - 반복 횟수 모를 때

 

while 조건식 {

  //조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.

}

 

for문과 100% 상호 대체 가능

 

for 문

public class Ex4_14 {
    public static void main(String[] args) {
        int num =12345, sum =0;
        //10으로 나머지 연산을 하면 마지막 자리를 얻는다.
//        System.out.println(12345%10);
        //num = 12345, 1234, 123,12, 1
        for(num=12345; num>0; num=num/10){
            System.out.println(num);
        }
        System.out.println("각 자리수의 합:" +sum);
    }
}

while문으로 바꾸기

 

public class Ex4_14 {
    public static void main(String[] args) {
        int num =12345, sum =0;
        //10으로 나머지 연산을 하면 마지막 자리를 얻는다.
//        System.out.println(12345%10);
        //num = 12345, 1234, 123,12, 1
        while(num>0){
            sum += num%10;
            System.out.println("sum"+sum+",num%10="+num%10);
            num =num/10;
        }
        System.out.println("각 자리수의 합:" +sum);
    }
}

 

do-while문

블럭{}을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용

 

break문

자신이 포함된 하나의 반복문을 벗어난다.

 

while문

public class Ex_16 {
    public static void main(String[] args) {
        int sum =0;
        int i =0;

        while(true){//무한 반복문 for(;true;) {}
            if(sum>100)
                break; //자신이 속한 하나의 반복문을 벗어난다.
            ++i;
            sum += i;
        } // end of while

        System.out.println("i=" +i);
        System.out.println("sum=" + sum);
    }
}

for문

public class Ex_16 {
    public static void main(String[] args) {
        int sum =0;
        int i =0;

        for(;;){//무한 반복문 for(;true;) {}
            if(sum>100)
                break; //자신이 속한 하나의 반복문을 벗어난다.
            ++i;
            sum += i;
        } // end of while

        System.out.println("i=" +i);
        System.out.println("sum=" + sum);
    }
}

 

continue문

자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘아감

전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용

break문과 달리 반복문을 벗어나지 않는다.

 

public class Ex4_17 {
    public static void main(String[] args) {
      for(int i=0; i<= 10; i++){
          if(i%2==0)
              continue;
          System.out.println(i);
      }
    }
}

 

예시

import java.util.Scanner;

public class Ex4_18 {
    public static void main(String[] args) {
        int menu =0;
        int num =0;

        Scanner scanner = new Scanner(System.in);

        while (true){ // 무한 반복문
            System.out.println("(1) square");
            System.out.println("(2) square root");
            System.out.println("(3) log");
            System.out.println("원하는 메뉴(1~3)을 선택하세요. (종료:0>");

            String tmp = scanner.nextLine(); //화면에서 입력받은 내용을 tmp에 저장
            menu = Integer.parseInt(tmp); //입력받은 문자열(tmp)을 숫자로 변환

            if(menu==0) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else if (!(1<=menu && menu<=3)) {
                System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
                continue;
            }
            System.out.println("선택하신 메뉴는" + menu + "번입니다.");

        } //main의 끝
    }
}

 

이름붙은 반복문

반복문에 이름을 붙여서 하나 이상의 반복문을 벗어날 수 있다.

 

 

오늘부터 다시 주특기 언어 주차로 돌아가서 자바 공부를 합니다. 다음주까지 알고리즘 문제 28개를 풀고 과제를 제출하고 알고리즘 시험을 통과해야 합니다. 새로운 조로 배정이 되었는데 저는 자바 걷기반을 선택했습니다. 시간이 생각보다 훅훅 지나가네요. 

 

🎼오늘의 노래 서인국 애기야

 

사랑스러운 자바

 

IntelliJ 단축키 모음

  • 코드 라인 복사해서 다음 라인에 붙이기: Command + D
  • System.out.println : sout
  • 라인 삭제: Command + Backspace
  • Column selection mode (블럭단위 편집, 세로편집 모드 전환) : Command + Shift + 8
  • 파일 찾기: Command + Shift + O
  • 클릭한 메서드로 이동: Command + 클릭
  • 이전/다음 시점으로 이동: Command + Option + 화살표(좌, 우)
  • 단어 단위 이동: Option + 화살표(좌, 우)
  • 파라미터 변수 확인: Command + P
  • 변수 추출: Command + Option + V
  • 이전 클래스 확인: Command + E
  • 해당 테스트 실행: Control + Shift + R
  • 해당 테스트 디버깅 실행: Control + Shift + R
  • 최근 실행했던 테스트 실행: Control + R
  • 최근 실행했던 테스트 디버깅 실행: Control + D
  • 해당 코드 라인 마치고 다음 라인으로 이동: Command + Shift + Enter
  • 테스트 클래스 생성/이동: Command + Shift + T
  • import 하기: Option + Enter
  • 쓰지 않는 import 정리 하기: Control + Option + O
  • 자동 완성: Control + Space
  • 메서드 생성 및 수정: Option + Enter
  • 주석: Command + /
  • 문법 단위로 코드 이동: Command + Shift + 화살표(상, 하)
  • 한줄 단위로 코드 이동: Option + Shift + 화살표(상, 하)
  • 생성자/Getter/Setter/toString 만들기: Control + Enter
  • 해당 메서드를 사용하는 곳 조회: Option + F7

 

프로그래머스 문제 Java

3.  가운데 글자 구하기

길이를 구해서 중간 글자를 출력 합니다.

 

  1. .length() 메소드를 이용해서 String s의 길이 값을 구한다.
  2. int length = s.length();
  3. 2로 나눈 값의 나머지가 0인 경우는 짝수 -> (length%2==0)
  4. 짝수인 경우, 중간 문자 2개가 answer가 된다. int 이기 때문에 자동으로 소수점 이하 값은 없애버림
  5. 예시. String s = cute; int length =4; 4%2 ==0; 짝수
  6. .charAt() 메소드를 이용해서 x 번째 문자의 값을 구한다
  7. 짝수인 경우 가운데 두글자
  8. 홀수인 경우 가운데 한글자
public class Ex2_1 {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String answer = "";
        int length = s.length();
        if(length%2==0){
            answer+= s.charAt(length/2-1);
            answer+= s.charAt(length/2);
        }else{
            answer+= s.charAt(length/2);
        }
        System.out.println(answer);


    }
}

제출하고 통과는 했으나....

한줄 짜리 코드로도 가능했던 것이었던 것이었습니다.

substring()

.substring 메소드를 이용하는 방법

.substring(start letter, end letter)

시작하는 글자, 끝나는 글자 순번을 넣어주면 됩니다.

.substring(start letter)

시작하는 글자 부터 끝까지 출력합니다. 

 

4. 정수의 합 구하기

a와 b 사이의 숫자를 모두 더한 값을 구하는 문제입니다.

 

  1. a와 b 중 큰 값을 long max, 작은 값을 long min 으로 정의한다.
  2. for문의 초기값을 min, 최대값을 max, 증가연산자 일 때 합을 구한다
public class Ex2_1 {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        long answer =0;
        long min = Math.min(a,b);
        long max = Math.max(a,b);
        for (long x=min; x<=max;x++){
            answer += x;
        }
        System.out.print(answer);


    }
}

이렇게 열심히 했는데....

sumAtoB라는 함수가 있었습니다..

sumAtoB() 는 A와 B 사이의 값을 구합니다. 

sumAtoB()

 

5. 문자열을 정수로 전환하기

public class Ex2_1 {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
        int answer = 0;
        String s = scanner.nextLine();
        answer = Integer.parseInt(s);
        System.out.println(answer);

    }
}

되게 간단하다고 생각을 했었습니다만....

마! 이게 알고리즘이다

 

6. 없는 숫자 더하기

말그대로 없는 숫자를 더해야 합니다.

 

function solution(numbers) {
  let answer = 0;
   
  for(let i = 0; i <= 9; i++) {
    if(!numbers.includes(i)) answer += i;
  }
   
  return answer;
}

0부터 9까지 숫자가 있는데 없으면 그 수를 더한다.

!변수.includes() 메소드를 사용한다. ! == not

 

자바의정석

 

  • 자바란? 
    • 프로그래밍언어
    • 애플리케이션을 만드는데 사용
      • PC 애플리케이션: IntelliJ, eclipse
      • 웹 애플리케이션
      • 모바일 애플리케이션(안드로이드)
      • 빅 데이터 : hadoop
      • 게임(마인 크래프트), 과학, 소형기기 등
  • Why 자바?
    • 다양한 분야에서 활발히 사용
    • 20년동안 1, 2위를 유지
    • 첫번째 프로그래밍 언어로 GOOD
      • 배우기 쉽고 풍부한 학습자료
    • 모던 프로그래밍 언어(객체지향 + 함수형)
    • 취업에 유리
  • 강의는 Java SE 8 에 맞춰져 있음; 근데 요즘엔 6개월 마다 버전을 출시한다고 함

 

자바의 특징

  • 배우기 쉬운 객체지향 언어(C++, java, python, js)
  • 자동 메모리 관리 (GC: garbage collector)
  • 멀티 쓰레드 지원
  • 운영체제에 독립적

 

자바 가상 머신(JVM)

  • 자바 프로그램이 실행되는 가상컴퓨터(VM)
  • 한번 작성하면, 어디서든 실행(Write once, run anywhere)

자바 API 문서

  • 자바 사전

 

자바의 정석 기초편 github

 

 

GitHub - castello/javajungsuk_basic: 자바의 정석 기초편 관련 자료입니다.

자바의 정석 기초편 관련 자료입니다. Contribute to castello/javajungsuk_basic development by creating an account on GitHub.

github.com

 

드디어 한 주가 끝났습니다. 일주일동안 핵심 쏙쏙 Git 강의를 들었고 혼자 공부하는 자바 챕터 5까지 진도를 나갔습니다. 이번주는 Pre-Onboarding 기간으로 주특기 언어를 학습하는 시간이었고 다음주부터 정식으로 시작합니다. 부족한 공부를 위해서 어떻게 해야하나 백준이랑 프로그래머스라는 게 있다는 데 조사를 해봐야겠습니다. 일단 어디서 시작해야할지 알아보는 중이에요. 아예 새로운 분야에 입문하려고 하니까 공부할 게 태산이네요. 

 

티끌모아 태산 가즈아😎

 

🎼오늘의 노래 - Joopearl Blues

자바가 뭐라고 생각해요?

 

TIL

  • 마우스를 사야겠다
  • 백준 그리디 알고리즘 부터 풀어보기
  • 어떻게든 역량을 키우자
  • Git IntelliJ로 사용하는 법 https://youtu.be/uUzRMOCBorg

어제 기술매니저님께서 책(혼자 공부하는 자바)에 나오는 연습문제 정도는 바로바로 풀 줄 알아야 한다고 하셔서 오늘은 복습에 초점을 맞출 예정입니다. 일단 챕터 5를 다 끝내고 챕터 1부터 연습문제 답지 안보고🤓 다 한번 풀어보겠습니다. 벌써 토요일이네요.

 

🎼오늘의 노래 그레이- 하기나 해

 

하기나 해!! 제발요!!

 

05-3 열거 타입

  • 열거 타입(enumeration type):한정된 값만 갖는 타입
    • 열거 상수(enumeration constant) 중에서 하나의 상수를 저장하는 타입

 

열거 타입 선언

  • 1. 열거 타입의 이름을 정하고 해당 이름으로 소스 파일(.java)을 생성해야 함
    • 이름은 관례적으로 첫 글자를 대문자로 하고 나머지는 소문자로 구성함
    • 여러 단어로 구성된 이름이라면 각 단어의 첫 글자는 대문자로 하는 것이 관례임
  • 2. 소스 파일 내용으로 열거 타입 선언 -> public enum : 열거 타입을 선언하기 위한 키워드 (반드시 소문자로 작성)
    • 열거 타입 이름은 소스 파일 이름과 대소문자가 모두 일치해야함
    • public enum 열거타입 이름 {...}
  • 3. 열거 상수 선언
    • 열거 탕비의 값으로 사용
    • 모두 대문자로 작성함
      • public enum Week { MOMDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
    • 여러 단어로 구성될 경우 밑줄(_)로 연결

 

열거 타입 변수

  • 열거 타입은 변수를 선언하고 사용 가능
    • 열거타입 변수;
  • 열거 상수를 저장
    • 열거타입 변수 = 열거타입.열거상수;
    • ex) Week today = Week.SUNDAY;
    • ex) Week birthday = null;
  • 열거 상수는 열거 객체로 생성
    • Week 의 경우 총 7개의 Week 객체로 생성
    • 메소드 영역에 생성된 열거 상수가 해당 Week 객체를 각각 참조
    • 열거 타입은 참조 타입
    • 열거 상수는 객체!
  • Week today = Week.SUNDAY;
    • 열거 타입 변수 today 스택 영역
    • today에 저장되는 값은 Week.SUNDAY 열거 상수가 참조하는 개체의 번지
    • 열거 상수 Week.SUNDAY와 변수는 서로 같은 Week 객체를 참조
    • today == Week.SUNDAY; //true

 

  • week1와 week2는 모두 Week.SATURDAY 상수라는 동일한 Week 객체를 참조
Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
System.out.println( week1 == week2 ); //true
  • 자바는 컴퓨터의 날짜 및 요일, 시간을 얻기 위해 Calendar 클래스를 제공함
  • Calendar 변수를 선언 -> Calendar.getInstance()
    • Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR); //연
int month = now.get(Calendar.MONTH) +1; //월(1~12)
int day = now.get(Calendar.DAY_OF_MONTH); //일
int week = now.get(Calendar.DAY_OF_WEEK); //요일(1~7)
int hour = now.get(Calendar.HOUR); //시간
int minute = now.get(Calendar.MINUTE); //분
int second = now.get(Calendar.SECOND); //초

 

열거 타입과 열거 상수

Week.java (열거 타입 선언)

public enum Week {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}

Main.java (열거 타입 사용하기)

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Week today = null;
        Calendar cal = Calendar.getInstance();
        int week = cal.get(Calendar.DAY_OF_WEEK);

        switch (week) {
            case 1:
                today = Week.SUNDAY; break;
            case 2:
                today = Week.MONDAY; break;
            case 3:
                today = Week.TUESDAY; break;
            case 4:
                today = Week.WEDNESDAY; break;
            case 5:
                today = Week.THURSDAY; break;
            case 6:
                today = Week.FRIDAY; break;
            case 7:
                today = Week.SATURDAY; break;
        }

        System.out.println("오늘 요일: " + today);

        if(today == Week.SUNDAY) {
            System.out.println("일요일에는 축구를 합니다.");
        } else {
            System.out.println("열심히 자바 공부합니다.");
        }
    }
}

 

열거 타입을 사용하려면 public enum 열거 타입 선언한 먼저 해야함

 

 


확인문제 복습 손코딩으로 하기

손코딩으로 해야 는다는 글을 어디서 본 적이 있어서 복습은 노트에 손코딩하면서 하기로 결심했습니다. 확실히 답지도 안보고 문제만 보면서 펜으로 노트에 직접 쓰니까 더 머릿속에 잘 들어오는 듯 합니다. 그래도 한 번 푼 문제라고 풀리는 문제가 안풀리는 문제보다는 많습니다.

 

근데 생각보다 저는 더 악필이네요🤓

 

  • while문에 break; 잊지 않기
  • 타입 선언 잊지 않기
  • 변수 선언한 {}를 벗어나놓고 왜 안되지 하지 않기
  • 이유 알고 쓰기
  • {} 빼먹지 않기; 실행 순서 알기
  • 문제를 꼼꼼히 읽읍시다
  • String 변수는 .equals() 메소드를 사용

chapter 2 변수

Chapter 02-1

1. o,x 문제

  • 변수는 하나의 값에만 저장할 수 있음
  • 변수 선언 시에 사용한 타입의 값만 저장할 수 있음
  • 변수는 초기 값이 저장되지 않은 상태에서 읽을 수 없음

2. 변수 이름으로 사용할 수 있는 것 o,x 문제

  • $value는 사용할 수 있음
    • 첫번째 글자는 문자이거나 '$', '_' 만 가능함

 

Chapter 02-2

2. o,x 문제

  • char var = 'AB'; //char 타입이 아니라 String 타입임
  • long var = 50000000000; //long은 int 타입의 범위를 벗어 날 시 숫자 뒤에 L 을 붙어야 함
  • String var = "나의 직업은 "개발자" 입니다."; //"를 썼으면 안에는 '를 써야함
  • float = 1e2f; // 변수 이름을 빼먹음😱😱

 

Chapter 02-3

10. 다음 코드 실행했을 때 출력 결과

String str1 = 2+3+""; //5
String str2 = 2+""+3; //23
String str3 = "+2+3; //23

+ 연산에서의 문자열 자동 타입 변환

숫자 + 숫자 -> 덧셈 연산 -> 숫자

"문자열" + 숫자 -> " 문자열"+"숫자" -> "문자열숫자"

숫자 + "문자열" -> "숫자" + "문자열" -> "숫자문자열"

 

손코딩 연습

 

 

Sololearn에서 제공하는 Java 언어 학습은 총 60개 레슨으로 이루어져 있습니다. 현재는 아직 40번째 레슨에 머물러 있는 상태에요. 뒤로 갈수록 어려워져서 그렇습니다. 부트캠프 핑계로 Sololearn을 놓고 있지만 이번주 일요일까지는 Sololearn의 Java를 끝내 보도록 하겠습니다. 어차피 저랑은 당분간 친해지려고 노력해야하는 언어입니다. 이 포스팅에서는 공부하다가 헷갈리거나 다시 복습하고 싶은 부분을 캡쳐해서 정리해보려고 합니다.

 

지난번에 썼던거 다 날라가서 슬펐지만 다시 마음 다 잡고 복습해봅니다.

복습 두 번 하면 좋지 뭐...🥹

 

sololearn Java

Scanner

  • Scanner class를 사용하기 위해서 다음 syntax를 사용함
    • Scanner myVar = new Scanner(System.in);

scanner

Division

  • int 타입으로 계산한 것은 int 타입으로 결과가 나옴
  • 소수점까지 원하면 double을 사용

division

 

Prefix & Postfix

  • Prefix: 변수의 값을 증가시키고 새로운 증가된 값을 연산에 사용
  • Postfix: 변수의 값을 사용 후에 값을 증가시킴

prefix postfix

Decision Making

  • 조건문(conditional statements)는 다른 조건에 다른 실행을 하도록함
  • if문은 가장 자주 사용되는 조건문중에 하나
  • if가 true이면 실행되고 아니면 다음 코드가 실행됨

decision making

if...else Statements

  • if문이 false이면 else가 실행됨

if else

The OR Operator

  • The OR Operator(||)은 어느 하나가 true이면 실행

Or Operator

The default Statement

  • switch문은 default case를 옵션으로 가질수 있음
  • 다른 케이스가 다 false이면 default case를 실행
  • default case는 break문이 필요 없음

the default Statement

The switch Expression

  • allows multiple comma-separated values per case
  • -> 을 사용함

switch expression

while Loops

  • 주어진 조건이 true인 이상 계속 반복

while문

for Loops

  • 특정한 숫자만큼 반복한다
  • for(initialization; condition; increment/decrement){statement(s)}

for문

 

do...while Loops

  • do...while문은 최소 한번은 실행됨
  • 일단 한번 실행 하고 그다음에 while 문 조건에 따라 실행

do while

 

continue

  • 반복문이 스킵하고 다음으로 넘어가게 함

continue

Arrays

  • int [ ] arr = new int[5]
    • new 키워드를 사용해서 array에 integers 5개가 있다고 선언함

arrays

 

Enhanced for Loop

enhanced for loop

 

Reverse a String

  • .toCharArray() : String 타입을 CharArray로 바꾼다. 문자열을 문자별로 다 따로 저장
    • ex) "Santa" -> "S", "a", "n", "t", "a"
  • arr.length에 -1을 하는 이유: 
    • .length에 -1을 하지 않는 경우: core dump error가 발생
    • arr[10]에서 배열의 첫 주소는 0부터 시작하지만!!
    • 즉, 배열의 주소는 arr+0, arr+1, ..., arr+9까지이고, 이는 arr[0], arr[1], ..., arr[9]로 표현됨
    • 즉, arr[10]부터는 존재하지 않고 arr[10]에 관한 코드가 작성되면 에러가 발생
    • 이중for문에서 j<length(=10)이기 때문에 j가 될 수 있는 가장 마지막 수는 9가 되니 j가 9인 경우, if문 안에 j=9인 상황을 대입하면 arr[9] < arr[10]입니다. 이 때 arr[10]은 코드 어디에도 정의되지 않았기 때문에 찾을 수 없음. 그렇기 때문에 컴퓨터는 arr[10]이 도대체 어디 정의되었는지 알 수 없다고 에러를 발생시킵니다.
    • 그렇기 때문에 for문의 범위를 length-1까지 정해준다.
  • 그러니까 갯수 세는건 우리가 아는 것 처럼 세지만!!! index 번호는 0부터 시작하니까 array 마지막 수를 부르고 싶으면 array.length-1 을 써야한다!

Reverse a String

Object-Orientation

  • Java는 Object-Oriented Programming(OOP) 객체지향 프로그래밍 스타일을 사용하고 현실과 가깝게 프로그래머들이 생각할 수 있도록 한다
  • OOP에서는 각 객체가 유니크 아이덴티티를 가진 독립적인 유닛이다. (마치 현실에서 그런것처럼(?))
    • 사과는 객체이다. 머그잔도 그러하다. 각각의 사물은 그만의 아이덴티티를 가진다. 두개의 머그잔이 똑같이 생길 수는 있지만 각각의 독립적인 유니크한 objects이다.
  • Objects는 그들을 묘사하는 특징이 있다.
    • 차가 빨간색이거나 파란색, 머그잔이 가득 차 있거나 비어있는 것처럼 말이다.
    • 이러한 특징(characteristics)들은 attributes라고 불린다.
    • attributes는 object의 현 상태를 묘사한다.
    • 차가 움직이거나 전화가 울리는 것처럼 object type에도 behavior 가 적용된다.
  • object는 3가지 dimension이 있다:
    • identity
    • attributes - describe object's current state
    • behavior - what the object is capable of doing
  • class는 object가 뭐가 될지를 묘사한다. object의 청사진(blueprint)과 같음

Object Orientation

 

 

Methods

  • Methods는 behavior를 정의한다
  • Method는 실행문의 집합; function이라고도 함
  • 아래 코드를 보면 sayHello라는 method를 선언함 
  • 메소드를 먼저 정의하고 그 다음에 사용함

Method

 

 

Static

static이 헷갈려서 댓글창을 열어보았읍니다...🤓 영어 만세!

  • memory에는 3가지 타입이 있다:
    • 1. static memory: 실행을 위해 프로그램의 변수/함수/object 저장
    • 2. stack memory: 함수를 실행하기 위해 변수를 저장( 함수 실행 전, arguments/registers 저장, 함수 실행후 옛 값들 로드)
    • 3. heap memory: objects를 저장
  • 실행하기 전에는 objects, 함수, 변수가 없음. 함수를 불러서 프로그램을 시작해야만함
    • 여기서 함수는 main()을 말함
      • main 함수는 static memroy에 생성이 됨
      • 그래서 우리는 main함수를 static이라고 정의함
    • 다른 함수는 필요하다면 static이라고 정의 할 수 있음
  • Static keyword는 변수, objects, 메소드를 준비하기 위해서 사용

static

 

Public

  • Public: accessible anywhere
  • Protected: Accessbible by subclass in other packages, same class and package
  • Private: Accessible by the same class
  • 누가 너의 데이터 또는 메소드에 접근할 수 있는 지를 정의한다

public

 

Hello World! code reuse

  • 아마 반복문이 이해가 안되서 캡쳐를 했던 거 같습니다...
  • 초기값 i= 0, i<=2, i ++ 일때 sayHello()를 실행한다
  • 0부터 시작해서 0,1,2 총 3번 실행합니다. 

Hello world

 

Code reuse 와 parameters

  • method 사용의 장점
    • 코드를 재사용할 수 있음
    • parameters: parameter에 따라서 여러가지를 실행할 수 있음

 

void

  • void는 아무것도 return하지 않는다
  • public static void main(String[] args)의 뜻
    • main methd는 Stirng arrays를 parameters로 불러오고 아무 값도 return 하지 않는다(void)

 

Creating Classes

  • 나만의 커스텀 objects를 생성하기 위해서 class를 만들어야함
  • public class Animal { void bark(){System.out.println("Woof-Woof")
    • bark()가 뭐인지 선언한 것임 
    • class와 그 안의 methods를 사용하기 위해서는 object를 선언해야함

Class 만들기

 

Creating Objects

  • dog 는 Animaldml object가 됨 -> bark()를 부를 수 있음 .을 이용해서
  • .은 object의 attributes와 methods에 연결하기 위해 사용함
  • 이해 안되서 댓글을 캡쳐한 것으로 보임🤓 Gracias Miguel
Object name = new Object();

 

Animal object를 아무 이름으로 만들 수 있어요. 예를 들자면:

 

Animal cat = new Animal();
Animal mouse= new Animal();

 

 

new Animal()을 쓰는 이유는 constructor가 없기 때문이에요. constructor가 있다면 이렇게 됩니다:

 

public class Animal{
   private String name;

 

 

//constructor with parameters

public Animal(String name){
this.name = name;
}

 

//constructor without parameters

public.Animal(){
  this.name="";
 }
}

 

Creating Objects

 

Access Modifiers

  • public: access modifier-> 접근 레벨을 정한다
    • accessible by any other class
  • default: the class is accessible only by classes in the same package
    • 따로 정의 되지 않으면 같은 package안에서는 다 접근 가능
  • protected: 같은 package + subclass는 접근 가능
  • private: 선언된 class만 접근가능

access modifiers

 

Getters & Setters

  • 여기서 조금 막혔습니다😢 혼공자에서 더 파볼 예정
  • Getter: get변수이름; 변수 이름 첫글자 대문자 - return the value
  • Setter: set변수이름; 변수 이름 첫글자 대문자 - set the value

getter and setter

 

static variables

  • static variables&methods는 class에 속함
  • static variable은 다 대문자로 씀

static variable

 

Packages

  • packages: 이름 충돌과 class 접근을 통제하려고 사용됨
    • a group made up of similar types of classes, along with sub-packages

packages

 

Encapsulation

  • OOP에는 4가지 핵심 컨셉이 있습니다
    • encapsulation
    • inheritance
    • polymorphism
    • abstraction
  • encapsulation: implementation details are not visible to users
    • variables of one class will be hidden from the other classes, accessible only through the methods of the current class => data hiding
    • Java에서 encapsulation을 위해서 class변수를 setter와 getter methods로 수정하고 변수값을 본다....??

Encapsulation

 

+ Recent posts