본문 바로가기
What I Learned

[WIL] Day 3

by 케찹이 2023. 5. 8.
반응형

<Java>

클래스(static) 메소드 vs 인스턴스 메소드

필드: 클래스가 가지는 속성. 

내가 알기로는 클래스 메소드는 레퍼런스 객체 생성하지 않고 바로 참조해서 사용가능.

반면에 인스턴스 메소드는 객체 참조를 해야하고 사용해야 함. (그게 맞음)

 

인스턴스 필드는 static이 안붙어있는 필드. 얘네들은 클래스 메소드에서 사용 불가.

또 클래스 필드는 static block에서 초기화가 가능하다. 

Static 블록은 main 메소드보다 먼저 실행한다. 꼼수 같은 작업이 가능하다. 

public class User {
    String name;    // 인스턴스 필드
    String address;
    boolean isVip;
    static int count ;   // 클래스 필드
    static{     // static 블록에서 초기화 가능
        count = 100;
    }

    public void printName(){    // 인스턴스 메소드
        System.out.println("my name is " + name);
    }
    public static void printCount(){    // 클래스 메소드
        System.out.println("count : " + count);
    }
}

다형성-메소드 오버로딩, 이름은 같고 매개변수 갯수나 타입이 달라지는 함수들. 여러가지 타입들을 허용해야한다.

상속: 일반화+확장, 상속은 반드시 써야할때만 쓰고 되도록 사용 안하는게 좋음. 결합도 낮추고 응집도 높이는게 중요하기 때문. 상속하면 결합도가 너무 강력함. 

메소드 오버라이딩: 함수 덮어쓰기. 오버라이딩: 같은 함수 이름 여러 다른 형식의 파라미터.

메소드가 오버라이딩 되면 무조건 오버라이딩된 메소드가 실행이 된다. (그 참조타입이 부모여도, 오버라이딩된 메소드가 실행!!!!)

대신 필드값의 경우에는 오버라이드를 했다고 해도 부모를 따라간다.

 

메인 함수 실행 단축키(맥): 컨트롤+shift+R

Getter/setter 단축키(맥): 컨트롤+엔터 

Getter/setter같은걸 프로퍼티라고 한다. 

toString()은 out.println(객체)를 하면 모든 객체는 Object를 상속하고 있기 때문에 결과적으로 Object의 toString()을 보여준다. 그치만 그러면 아무 의미 없는 값을 리턴하기 때문에 필요하면 내 클래스에서 toString()을 직접 오버라이딩이 필요하다. 

equals()라는 함수는 객체의 기준이 필요하다. 나중에 컬랙션에서 hashCode()와 함께 사용된다. 

 

부모의 생성자를 호출할때는 super()를 사용한다. 부모 생성자가 기본 생성자가 없을때는 반드시 super()를 호출해야한다.

템플릿 메소드 패턴, 추상클래스가 가장 많이 사용된다. 예를 들어 다양한 Controller이 필요한데 모든 컨트롤러는 초기화, 실행, 마무리 단계를 거치고 초기화와 마무리는 같은 코드가 반복되고 실행이 각 컨트롤러마다 다르게 실행이 된다고 할때 Controller를 추상클래스로 만들고 초기화와 마무리 단계는 Controller안에서 정의를 하고 실행함수만 추상메소드로 만들면 Controller를 상속해서 각각의 다른 종류의 컨트롤러를 만들수가 있다.

그리고 컨트롤러의 실행 순서를 지키기 위해서 메소드를 만드는데 그런 메소드를 템플릿 메소드라고 하더라…

메소드에 final 붙어있으면 오버라이딩이 금지가 된다. 위의 예시에서 초기화와 마무리같은 경우 final 적용시켜서 상속받는 클래스에서 메소드를 실수로 오버라이딩하는 것을 방지.

 

/*
아래 과정을 반복한다
* 초기화
* 실행
* 마무리
*
* */

public abstract class Controller {

    // final을 해서 상속받는 클래스에서 해당 함수의 오버라이딩을 막아준다.
    protected final void init(){
        System.out.println("초기화 하는 코드");
    }
    protected final void close(){
        System.out.println("마무리 하는 코드");
    }
    protected abstract void run();

    // 템플릿 메소드
    public void execute(){
        init();
        run();
        close();
    }
}

클래스에 final을 추가하면 상속을 금지시킨다. 대표적인 예)String class

 

인터페이스, 내가 만들고자 하는 기능만을 나열한것.

모든 필드가 public static final이어야 하고 모든 메소드가 public abstract이어야 한다. (단 생략가능)

default method: java8부터 interface에서 메소드에 구현을 가능케 만들었다. 배포 문제 때문에.

 

팩토리 메소드 패턴, 공장처럼 복잡한 생산 과정을 숨기고 완성한 인스턴스만 반환하는 형식. 

자바 리플렉션, 참조타입이 뭔지 확정이 안됐을 때 추후에 클래스를 문자열로 추가해서 해당 참조타입을 전달해줄 수가 있다. 이 과정에서 사용된 패키지가 리플렉션(좀 어려워서 자세한 사용법은 쓸일이 있을때 찾아봐야 됨)

Class clazz = Class.forName(“클래스 풀네임”);

Object obj = clazz.newInstance();

 

Anonymous Class. 해당 클래스는 이름이 없고 선언하는 클래스를 상속받아 클래스를 생성한다. 

예) Car c1 = new Car(){ ….. }

interface같은 경우는 위와 같이 사용할시 자동으로 저게 튀어나옴. 

이런 이름없는 객체를 람다 인터페이스라고 한다. () => {}

 

<알고리즘>

에라스토테네스의 채.

주어진 범위의 숫자들이 존재할때 소수를 찾아내는 가장 빠른 방법.

중요한 전제는 숫자들의 범위이다. 알고리즘은 다음과 같다.

1. 1은 소수가 아님으로 제외. 2는 소수임으로 추가해준다.

2. 2를 제외한 모둔 2의 배수를 제외한다.

3. 3은 소수임으로 추가, 3을 추가하고 모든 3의 배수를 제외한다.

4. 소수를 대상으로 위와 같은 단계를 반복한다, 해당 소수의 제곱이 주어진 범위보다 작을때까지.

 

 

<암호화폐 101>

시리즈2편

Proof of work가 무엇이고, mining이 무엇인지, 그리고 그래픽카드랑 뭔 상관인지 알수 있음.

누가 블록을 추가할 수 있어야 하나? 어떤 데이터가 추가되어야하나? 비트코인, 이더리움 같은 결제내역, 잔고 같은 기록은 아무나 블록을 생성할 수 있어서는 안됨.

오직 진실된 데이터만 추가할 수 있어야 한다. 이를 위해서 proof of work가 필요하다. 이를 여러 악용사례로부터 블록체인을 보호할 수가 있음.

채굴자는 블록체인에 들어오는 데이터를 확인한다. 왜냐면 채굴자가 데이터를 블록안에 넣어서 블록체인에 보내는 역할을 하기 때문. 

예로 내가 누군가에게 비트코인을 보내면, 채굴자가 내역을 체크하고, 내용이 사실이면 블록안에 추가. 다른 사람의 내역들도 확인하고 블록이 꽉 차면 블록체인에 연결을 해준다.

누구든 채광자가 될 수 있다. 내역을 검사하면 수수료를 벌 수 있음.

 

Proof of work가 채광자에게 모든 네트워크가 다 아는 질문을 던짐. 그리고 답을 찾아야지 블록을 체인에 올릴 수가 있음. 이때 보상을 2번 받을 수 있는데 한번은 거래내역 검증이고 한번은 질문의 답을 찾고 체인에 올리면서 보상을 받는다. 그리고 이때 비트코인이 생성. Coinbase transaction이 비트코인이 생성되는 순간이다. 

 

채굴자들이 답해야하는 질문은 뭘까?

nonce라는 것을 찾아야한다. 질문에서 난이도를 주어지고 nonce는 난이도가 주어진 갯수만큼의 leading 0를 가진 해시값을 찾으려면 어떤 nonce를 가져야하는지 질문으로 주어진다.  

nonce는 한번만 쓰인 숫자를 의미한다. 만약에 난이도가 3이면 해시값 첫3자리가 0이 되는 nonce를 구해야된다. 

이러한 조건이 주어지면 채굴자는 nonce의 여러값을 대입시켜 찾는다. 그래서 그러한 해시값이 나올때까지 계~~~~~속 반복한다. (거의 랜덤값 찾는 수준) 덕분에 블록생성이 어려운 이유이다. 

비트코인은 10분마다 블록을 생성한다. 너무 빨리 생성되면 네트워크에서 질문의 난이도를 높인다.

현재는 19 leading 0이 필요하고 실제 난이도 자체는 bits라는걸 통해서 계산된다.

 

시리즈3편

스마트 컨트랙을 덕분에 블록체인 기술 활용가능해졌다.

비트코인의 한계는 다른 사람들과의 교류가 불가능한것.주고받고 끝.

스마트컨트랙을 사용하면 사람들과 교류가 가능하고 코드로 소통이 된다.이를 통해서 decentralized app을 만들수있다.코딩을 해서 shared network에 공유가 가능하다. 사람들은 볼수있지만 변경은 불가능하다. 정리하자면 내가 코딩을 해서 주인이 없는 백엔드에 올리는 것. 블록체인의 안정성을 구축한채로 내 코드를 검증하는 것이 놀라운것.

 

단점은?

원하는 소스를 다 활용할 수가 없다. 그 이유는 스마트컨트랙은 결국 블록체인 네트워크에서만 실행이 가능하다. 예를 들어 비오는 내기를 하면 스마트컨트랙과 센서가 연결이 되어야하는데 이때 해당 센서와 신뢰기반의 거래를 해야한다. 정리하면 네트워크 외부의 무언가와 의존을 해야 된다는 것.

이걸 보완하기 위한 것이 Oracle. oracle이 신뢰할 수 있는 input을 제공해준다. 

스마트컨트랙을 지원하는 블록체인은 정말 많음. 가장 유명한것이 이더리움, 쿠사마, polkadot, cardano, cosmos…

반응형

'What I Learned' 카테고리의 다른 글

[WIL] Day 6  (0) 2023.05.13
[WIL] Day 5  (0) 2023.05.12
[WIL] Day 4  (0) 2023.05.10
[WIL] Day 2  (0) 2023.05.08
[WIL] Day 1  (0) 2023.05.04

댓글