[LIKELION] 221005

고관운·2022년 10월 5일

회고

😄 느낀점

  • List부분을 배운 적은 있지만 다시 공부해야겠다고 생각했다.
  • 속도가 약간 빠르지만 그만큼 배우는 것이 있는 것 같다.

😁 목표

  • CodeUp 100제 (1011~1020 풀기)
  • 스터디 프로그래머스 문제 풀기
  • [예습] List, Set

3주차 Git, Java 실무 연습(50~66)

IntelliJ에서 Git 활용

IntelliJ에서 Push

  1. Java파일 생성
  2. VCS ➡ Create Git Repositroy ➡ 프로젝트 클릭(오른쪽 아래 master를 main으로 고쳐라)
  3. 왼쪽 익스플로러에서 java파일만 commit(아래에 메시지 작성)(Ctrl + K)
  4. Git ➡ Manager remotes ➡ 추가(리모트 레퍼지토리)
  5. Git ➡ push

IntelliJ에서 Push시 gitignore 어떻게 생성?

  • new ➡ file ➡ .gitignore 파일 생성
  • 소스트리에서 생성
  • 깃 플러그인(.gitignore)을 활용 ➡ 무시할 파일 오른쪽 버튼 클릭 ➡ add에 .ignore

IntelliJ 단축키

  • Alt + Insert : generator
  • Shift + F6 : 이름바꾸기
  • iter : for each문 단축키

Java 기초

Java에서 막히는 부분

public class MyList{
	public static void main(String[] args) {
    	MyList myList = new MyList();
    }
}

🟢 자기 자신에서 자기 자신을 실행하는 것처럼 보임
🟢 보통 class를 2개 만들어서 한곳에서는 psvm, 다른 곳에서는 함수
(Main에서 함수의 클래스를 만든 후 함수 호출)

실습.사칙연산

  • 인터페이스를 이용하여, 랜덤한 수, 특정한 수를 생성하여 사칙연산하기
public interface NumberCreator {
    // 인터페이스는 자식 클래스가 구현
    // default를 하면 같은 패키지에서만 호출 가능
    int numberCreator(int num);
}

🟢 int : 자식 클래스가 int를 리턴하기 위해 int 사용
🟢 int num : RandomNumberCreator에서는 범위 지정, SpecificNumberCreator에서는 리턴값 지정

public class RandomNumberCreator implements NumberCreator{
    // 0~(num-1)까지의 숫자를 리턴
    @Override
    public int numberCreator(int num) {
        return (int)(Math.random() * num);
    }
}

🟢 0 ~ (num-1) 범위의 랜덤한 수 리턴

public class SpecificNumberCreator implements NumberCreator{
    // 특정한 정수를 리턴
    @Override
    public int numberCreator(int num) {
        return num;
    }
}

🟢 num을 받아 그대로 리턴

public class RandomCalculator {
    private int baseNum;
    NumberCreator numCreator;

	// numCreator에 RandomNumberCreator 또는 SpecificNumberCreator을 받아 넣기
    // baseNum을 지정 안해줬을 경우 10으로 고정
    public RandomCalculator(NumberCreator numCreator) {
        this.numCreator = numCreator;
        baseNum = numCreator.numberCreator(10);
    }

	// baseNum을 지정 해줬을 경우 num을 매개 변수로 전달
    public RandomCalculator(NumberCreator numCreator, int baseNum) {
        this.numCreator = numCreator;
        this.baseNum = numCreator.numberCreator(baseNum);
    }

    public void plus(int a) {
        System.out.println(a + " + " + baseNum + " = " + (a + baseNum));
    }

    public void minus(int a) {
        System.out.println(a + " - " + baseNum + " = " + (a - baseNum));
    }

    public void multiple(int a) {
        System.out.println(a + " * " + baseNum + " = " + (a * baseNum));
    }

    public void divide(int a) {
        try {
            double result = ((double) a / baseNum);
            if(Double.isInfinite(result) || Double.isNaN(result)){
                throw new ArithmeticException();
            }
            System.out.println(a + " * " + baseNum + " = " + result);
        } catch (ArithmeticException e) {
            System.out.println("랜덤하게 생성된 숫자가 0입니다.");
        }
        /*
        이렇게 코드를 짜면 소수점이 안나옴
        try {
            System.out.println(a + " / " + baseNum + " = " + (a / baseNum));
        } catch (Exception e) {
            System.out.println("랜덤하게 생성된 숫자가 0입니다.");
        }
        */
    }
}

🔴 생성자의 매개변수를 1개, 2개 넣었을 경우 비교
🔴 나누기 부분 : (double)을 넣어주면 infinity가 나와서 예외처리 불가 ➡ 따라서 isInfinite, isNaN 사용

public class RandomCalculatorMain {
    public static void main(String[] args) {
        // NumberCreator 인터페이스 = RandomNumberCreator(다형성)
        // 랜덤 숫자를 받아 생성자에 넣기
        RandomCalculator rc = new RandomCalculator(new RandomNumberCreator());

        rc.plus(10);
        rc.minus(10);
        rc.multiple(10);
        rc.divide(10);
        System.out.println();

        // NumberCreator 인터페이스 = SpecificNumberCreator(다형성)
        // 특정 숫자를 받아 생성자에 넣기
        RandomCalculator sc = new RandomCalculator(new SpecificNumberCreator(), 30);

        sc.plus(10);
        sc.minus(10);
        sc.multiple(10);
        sc.divide(10);
        System.out.println();

        // 안넣었다면 10으로 baseNum 설정해놨음
        RandomCalculator sc2 = new RandomCalculator(new SpecificNumberCreator());

        sc2.plus(10);
        sc2.minus(10);
        sc2.multiple(10);
        sc2.divide(10);
    }
}

🟢 랜덤한 수 , 특정한 수, 생성자 매개변수 개수 다르게 실행

자바의 원칙들

  • OOP(Object Oriented Programming)
    Class = Object (모든것을 클래스 기반으로 만든다 - 객체 지향 <-> 함수형)

  • SOLID

    1. 클래스는 하나의 기능
    2. 개방폐쇄의 원칙(변화에 폐쇄, 확장은 개방)
    3. 서브타입은 언제나 기반 타입으로 교체할 수 있어야 한다
    4. 인터페이스 분리의 원칙(자신이 사용하지 않는 인터페이스는 구현X)
    5. 의존성역전의 원칙
  • DI(Dependency Injection)
    di한다 - 생성자를 이용해 interface 구현체를 넘겨서 초기화시킨다

  • Pojo(Plain Old Java Object)
    extends -> EJB
    자바 코드로만 이루어진

  • IoC(Inversion Of Control)
    DI와 비슷함

Collection

Array

배열의 크기는 고정되어 있기 때문에 크기가 넘어가게 되면 다시 선언해줘야함.
➡ 단점 해결을 위해 List 사용

List

  • List는 크기를 따로 지정하지 않음(배열과 다른 이점)
  • List에 원소를 추가하기 위해 add함수 사용
  • List 길이는 size() 사용 (String은 length)

실습

  • 학생의 이름과 정보를 List를 활용하여 출력하기
public class Student {
    private int classNum;
    private String name;
    private String gitRepositoryAddress;

    public Student(int classNum, String name, String gitRepositoryAddress) {
        this.classNum = classNum;
        this.name = name;
        this.gitRepositoryAddress = gitRepositoryAddress;
    }

    public int getClassNum() {
        return classNum;
    }

    public String getName() {
        return name;
    }

    public String getGitRepositoryAddress() {
        return gitRepositoryAddress;
    }
}

🟢 생성자의 매개변수 3개를 이용하여 반번호, 이름, 깃허브주소 받기
🟢 getter함수를 사용하여 각 정보를 가져올 수 있도록 함

import java.util.ArrayList;
import java.util.List;

public class Names {
    private List<String> students = new ArrayList<>();
    private List<Student> studentObjs = new ArrayList<>();

    public List<Student> getStudentObjs() {
        this.studentObjs.add(new Student(1,"권하준","https://www.naver.com/"));
        this.studentObjs.add(new Student(1,"조성윤","https://www.google.co.kr/"));
        this.studentObjs.add(new Student(3,"안예은","https://www.naver.com/"));
        this.studentObjs.add(new Student(1,"남우빈","https://www.google.co.kr/"));
        this.studentObjs.add(new Student(2,"최경민","https://www.naver.com/"));

        return studentObjs;
    }

    // 많은 Name이 있기 때문에 따로 클래스로 빼기
    public List<String> names() {
        this.students.add("권하준");
        this.students.add("조성윤");
        this.students.add("안예은");
        this.students.add("남우빈");
        this.students.add("최경민");

        return this.students;
    }
}

🟢 String 리스트 students를 만들어 이름 추가
🟢 Student 리스트 studentObjs를 만들어 학생 정보 추가

import java.util.ArrayList;
import java.util.List;

public class LikeLion2th {
    // students 초기화
    private List<String> students = new ArrayList<>();
    private List<Student> studentObjs = new ArrayList<>();

    // Names 클래스에서 이름을 가져와 students에 할당
    public LikeLion2th() {
        Names names = new Names();
        this.students = names.names();
        this.studentObjs = names.getStudentObjs();
    }

    // 멋사자 2기 학생의 이름이 들어있는 list를 return하는 method
    public List<String> getStudentList(){
        return this.students;
    }

    public List<Student> getStudentObjsList(){
        return this.studentObjs;
    }
}

🟢 LikeLion2th를 따로 만든 이유 : 많은 학생의 이름과 정보를 넣으면 코드가 길어질 수 있기 때문에 따로 클래스 생성

import java.util.List;

public class ListPracticeMain {
    public static void main(String[] args) {
        LikeLion2th likeLion2th = new LikeLion2th();
        List<String> students = likeLion2th.getStudentList();
        List<Student> studentObjs = likeLion2th.getStudentObjsList();

        for (String student : students){
            System.out.println(student);
        }
        System.out.println("\n이름 총 개수 : " + students.size());
        System.out.println();

        for (Student student : studentObjs){
            System.out.println("반 : " + student.getClassNum());
            System.out.println("이름 : " + student.getName());
            System.out.println("깃주소 : " + student.getGitRepositoryAddress());
            System.out.println();
        }
    }
}

🟢 이름은 String이기 때문에 바로 출력
🔴 정보는 Student 클래스이기 때문에 getter를 이용하여 값 가져오기

0개의 댓글