[원격 강의] Java 실무 기초(2), 쉽게 배우는 알고리즘(4)

우정·2022년 11월 14일
0

[내일배움캠프] TIL

목록 보기
6/50

Java 실무 기초

객체지향언어

  1. 클래스
  • 개념 예시) 붕어빵 틀
  • 객체의 속성을 정의해 놓은 것(표현하고자 하는 대상의 공통 속성을 한 군데에 정의해 놓은 것)
  1. 인스턴스
  • 개념 예시) 붕어빵
  • 어떠한 클래스로부터 만들어진 객체
    • (= 그 클래스의 인스턴스 라고 부름)
    • instance는 한 번 생성되고 나면 그 자체의 상태를 가지고 그 자체로 변화하게 됨.
  • 코드
    class Phone {
        String model;
        String color;
        int price;
    }
    
    public class Main {
        public static void main(String[] args) {
            Phone galaxy = new Phone(); 
            galaxy.model = "Galaxy10";
            galaxy.color = "Black";
            galaxy.price = 100;
            
            Phone iphone =new Phone();
            iphone.model = "iPhoneX";
            iphone.color = "Black";
            iphone.price = 200;
            
    
            System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
            System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
        }
    }
  1. 메소드
  • 어떤 작업을 수행하는 코드를 하나로 묶어놓은 것
  • 어떤 일정한 작업의 단위, 중복된 코드, 프로그램의 재사용성과 구조화를 위해 메소드를 선언해 사용함
  • 메소드 선언시 지켜주면 좋은 코드 convention
    • 동사로 시작하자
    • camel case로 작성하자
  • 코드
     int [] heights = new int[]{10, 20, 30, 40, 50};  // 키가 저장되어 있는 배열
      
            intHeight(heights);
            sortHeight(heights);  // heights 오름차순으로 정렬
            printHeight(heights);  // heights에 있는 것을 하나하나 꺼내서 출력
            // 이러한 함수를 쓰지 않는다면 int[]에 초기화하는 로직{}을 적어줘야함
    // 더하기 함수
    int add(int x, int y) { // 맨 앞 int는 함수의 결과값이 전달되는 타입을 말함(return type)
                            // 함수 이름 뒤에 ()오는 두 개(int x, int y)는 parameter라고 함
      		return x + y
    }  // return은 표현(x+y)도 가능하고 특정 값을 리턴할 수도, int result = x + y;같이 이 안에서 선언된 변수 자체를 넘겨줄 수도 있음
    // 빼기 함수
    int minus(int x, int y) { // 위의 ()안의 값이랑 별개임
      		return x - y 
    }
    parameter: 내가 원하는 만큼 여러 개를 선언해서 쓸 수 있음
    • 오류
      class Calculation {
          int add(int x, int y) {
              return x + y;
          }
          int subtract(int x, int y) {
              return x - y;
          }
      }
        
      public class Main {
          public static void main(String[] args) {
              
              Calculation calculation = new Calculation();
              int addResult = calculation.add(x: 1, y: 2); // 오류
              int subtractResult = calculation.subtract(x: 5, y: 3); // 오류
        
              System.out.println(addResult);
              System.out.println(subtractResult);
          }
      }
        
      // 밑에처럼 숫자만 입력해야 오류 안 뜸...
      int addResult = calculation.add(1, 2);
      int subtractResult = calculation.subtract(5, 3);
  1. 생성자
  • instance가 생성될 때,
  • 정확히는 앞에서 new라는 키워드를 통해서 class의 instance를 생성할 때 불리는 초기화 method.
  • method의 일종인데 new를 할 때만 불리는 것
  • class의 이름이랑 똑같은 이름을 지어줘야함
  • return 값이 없음
  • 코드
    class Phone {
        String model;
        String color;
        int price;
      
     	// Alt+Insert 누르면 아래 코드 쉽게 생성 가능
        Phone (String model, String color, int price) { // 위의 모델 컬러 프라이스랑은 다른 값
            this.model = model;
            this.color = color;
            this.price = price;
        }
    }
      
    public class Main {
        public static void main(String[] args) {
            Phone galaxy = new Phone("galaxy10", "black", 100);
      
            Phone iphone =new Phone("iphoneX", "black", 200);
      
            System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
            System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
        }
    }
  • 클래스 안에 멤버변수로 선언하게 되면 그것들을 세팅 안 해줬을 때 기본값을 갖는데
    class DefaultValueTest {
        byte byteDefaultValue;
        int intDefaultValue;
        short shortDefaultValue;
        long longDefaultValue;
        float floatDefaultValue;
        double doubleDefaultValue;
        boolean booleanDefaultValue;
        String referenceDefaultValue;
    }
      
    public class Main {
        public static void main(String[] args) {
            DefaultValueTest defaultValueTest = new DefaultValueTest();
            System.out.println("byte default: " + defaultValueTest.byteDefaultValue);
            System.out.println("short default: " + defaultValueTest.shortDefaultValue);
            System.out.println("int default: " + defaultValueTest.intDefaultValue);
            System.out.println("long default: " + defaultValueTest.longDefaultValue);
            System.out.println("float default: " + defaultValueTest.floatDefaultValue);
            System.out.println("double default: " + defaultValueTest.doubleDefaultValue);
            System.out.println("boolean default: " + defaultValueTest.booleanDefaultValue);
            System.out.println("reference default: " + defaultValueTest.referenceDefaultValue);
        }
    }
  1. 상속
  • 기존의 클래스를 재사용하는 방식 중 하나
  • 상속을 통해 클래스 간의 계층구조를 만듦(부모-자식 클래스)
  • 특징
    • 자식 클래스는 부모 클래스의 특징들을 그대로 가지고 추가적인 속성, 기능이 있는 것
    • 부모 클래스에서 정의된 필드와 메소드를 물려받음
    • 자식 클래스에 새로운 필드와 메소드를 추가할 수 있음
    • 부모 클래스에서 물려받은 메소드를 수정할 수 있음(overriding)
  • 상속 코드
     class Animal {
         String name;
           
         public void cry() {
             System.out.println(name + "is crying.");
         }
     }
           
       class Dog extends Animal {
           Dog(String name) {
                this.name = name;
           }
           public void swim() {
               System.out.println(name + "is swimming.");
           
           }
       }
           
       public class Main {
           public static void main(String[] args) {
               Dog dog = new Dog("코코");
               dog.cry();
               dog.swim();
           
               // 상속을 받는 선언부에 부모 type을 쓸 수도 있음
       //        Animal dog2 = dog;  // 위의 Dog를 그대로 할당해줌
               Animal dog2 = new Dog("미미");  // 이렇게 해도 됨 // Animal type의 dog2라는 변수인데, 실제는 이 dog로 생성한 객체
               dog2.cry();  // Animal에 있는 cry는 호출할 수 있지만, dog에 있는 swim은 호출할 수 없음
       //        dog2.swim();  // 에러. 변수를 선언하는 type에는 Animal로 되어 있기 때문에 Animal에 있는 기능밖에 수행을 못함
           }
       }
           
       // 상속을 받을 때, 여러 class를 상속 받을 수 없음. 오직 하나의 class만!
       
  • overloading
    • 한 class 내에서 동일한 이름의 method를 여러 개 갖는 것
    • 기존에 없는 새로운 method를 정의하는데 같은 이름을 가지는 함수를 정의함
    • 조건
      - method 이름이 동일해야 함
      - 매개변수의 개수 or type이 달라야 함
    • 코드
    public class Main {
        public static void main(String[] args) {
                      
        }
              
        int add(int x, int y, int z) {
            return x+y+z;
        }
              
    //    long add(int a, int b, int c) {
    //        return a+b+c;
    //    }
    // return type만 다른 경우는 overloading이라고 하지 않음
    // 에러 이유. 이름과 매개변수의 개수와 타입이 모두 같음
    // x,y,z ,, a,b,c는 중요하지 않음
    // type의 순서, 개수만 봄
              
    //    long add(int a, int b) {
    //        return a+b;
    //    }  // overloading에 해당
              
    //    int add(int a, int b) {
    //        return a+b;
    //    }  // 이름만 같고 매개변수의 개수는 다르기 때문에 overloading에 해당됨
              
        long add(int a, int b, long c) {
            return a+b+c;
        }  // 개수는 같은데 type이 달라서 overloading에 해당됨
            
    }
          
  • overriding
    • 부모의 class로부터 상속받은 method를 똑같이 자식 class에 정의하는 것. 그래서 그것을 덮어버림. 부모에 있던 원래 함수의 내용은 없는 셈 친다.
    • 부모에 있는 똑같은 함수를 자식이 구현해서 부모에 있는 함수를 없는 체 하는 것
    • 코드
      class Animal {
          String name;
          String color;
                
          public Animal(String name) {
              this.name = name;
          }
          public void cry() {
              System.out.println(name + "is crying.");
          }
      }
      class Dog extends Animal {
          public Dog(String name) {
              super(name);
          }
                
          @Override  // 명확하게 나타내기 위해 어노테이션을 붙여줌
          public void cry() {
              System.out.println(name + "is barking");
          }  // Animal 과 똑같은데 cry 할 때 동작이 다름. crying 보다 barking 이라 하고 싶음
             // dog 로 만들었을 때, dog 가 위의 부모 class 에 있던 것을 override 한 함수일 경우에는 이것만 수행함
      }
                
      public class Main {
          public static void main(String[] args) {
              Animal dog = new Dog("코코");
              dog.cry();
          }
      }

알고리즘

  1. 트리
  • 계층 구조의 데이터를 쉽게 표현할 수 있음(계층형 비신형 자료 구조)
  • 선형구조 vs 비선형구조
    • 선형구조 : 자료를 저장하고 꺼내는 것에 초점이 맞춰져 있음
    • 비선형구조 : 데이터가 계층적, 혹은 망으로 구성되어있음. 또한 표현어 초점이 맞춰져 있음
  • 용어
    • Node : 트리에서 데이터를 저장하는 기본 요소
    • Root Node : 트리 맨 위에 있는 노드
    • Level : 최상위 노드를 Level 0으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄
    • Parent Node : 어떤 노드의 하위 레벨에 연결된 노드
    • Child Node : 어떤 노드의 상위 레벨에 연결된 노드
    • Leaf Node(Terminal Node) : Child Node가 하나도 없는 노드
    • Sibling : 동일한 Parent Node를 가진 노드
    • Depth : 트리에서 Node가 가질 수 있는 최대 Level
  • 종류
    • 이진 트리(Binary Tree)
      • 각 노드가 최대 두 개의 자식을 가짐(0, 1, 2)
    • 완전 이진 트리(Complete Binary Tree)
      • 노드를 삽입할 때 최하단 왼쪽 노드부터 차례대로 삽입해야 한다는 것
  • 구조를 표현하는 방법
    • 직접 클래스를 구현해서 사용하는 방법
    • 배열로 표현하는 방법 - 완전 이진 트리
  • 높이
    • 루트 노드부터 가장 아래의 리프 노드까지의 길이
    • 최대 O(log(N))O(log(N))
  • 최댓값(Max Heap)과 최솟값(Min Heap)을 빨리 찾기 위해 고안된 완전 이진 트리
  • 항상 큰 값이 상위 레벨에, 작은 값이 하위 레벨이 있도록 하는 자료 구조 = 부모 노드의 값이 자식 노드의 값보다 항상 커야 함
  • Max Heap
    • 최댓값이 부모 노드의 값임
    • 원소(노드) 추가
      • 새로운 원소를 맨 마지막에 넣고, 힙의 특성을 유지한 채 원소를 올려 힙을 확장시킬 수 있음
      • 시간 복잡도 : O(log(N))O(log(N))
    • 원소 제거
      • 최댓값, 즉 루트 노드를 삭제
  • Min Heap
    • 최솟값이 부모 노드의 값임
  1. 그래프
  • 노드와 노드 사이의 연결 관계에 초점이 맞춰져 있음
  • 용어
    • 노드(Node) : 연결 관계를 가진 각 데이터. (=정점.Vertex)
    • 간선(Edge) : 노드 간의 관계를 표시한 선
    • 인접 노드(Adhacent Node) : 간선으로 직접 연결된 노드(정점)
  • 표현 방법
    • 인접 행렬(Adjacency Matrix) : 2차원 배열로 그래프의 연결 관계를 표현
      • O(2)O(노드^2) 만큼의 공간을 사용
    • 인접 리스트(Adjacency List) : 링크드 리스트로 그래프의 연결 관계를 표현
      • 최대 O(간선)O(간선) 만큼의 시간을 사용
      • O(노드+간선)O(노드 + 간선) 만큼의 공간을 사용

  • 내일 목표
    • 자바 15 ~ 10강 듣기
    • 알고리즘 4강 다 듣기
    • 파이썬 기초 문법 복습
    • 알고리즘 1~2강 복습!!
      3,4강까지 하면 더 좋음 ~

0개의 댓글

관련 채용 정보