본문 바로가기

내일배움캠프 4기 스프링/내배캠 TIL📘

11. 10 JAVA 기초 강의/ 알고리즘 강의/ 알고리즘 특강

728x90

1.JAVA 기초 강좌

클래스/ 인스턴스/ 메소드 복습

*각 클래스에서 생성된 인스턴스는 생성된 후에는 각자의 개별 속성을 가지고 그 자체로 변화하게 된다

 

생성자 복습

*연산자 new가 인스턴스를 생성하는 것이지, 생성자가 인스턴스를 생성하는 것이 아니다. 인스턴스가 생성되며 (초기화 메소드인 생성자가) 호출되는 것이다.

**인텔리제이(윈)Alt + Insert/ (맥)Command + N : 생성마법사 

class Phone {
    String model;
    String color;
    int price;

    Phone(String model, String color, int price) {
        this.model = model; // 이 객체에 있는 model이라는 변수에, paremeter로 받은 model을 할당
        this.color = color;
        this.price = price;
    }
}

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone(); // 인자가 필요한데 인자를 안 넣어 컴파일 에러

        Phone iphone =new Phone();

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}

상속

코드를 클래스 단위로 쪼갤 수 있고, 중복된 클래스를 만들 필요없다. ~객체지향~

상대적으로 적은 양의 코드를 작성할 수 있고, 코드를 재사용할 수 있어 관리가 용이하다.

http://wiki.hash.kr/index.php/%ED%95%84%EB%93%9C_(%EC%9E%90%EB%B0%94)

1. 부모 클래스에서 정의된 필드와 메소드를 물려받는다.

2. 새로운 필드와 메소드를 추가할 수 있습니다.

3. 부모 클래스에서 물려받은 메소드를 수정할 수 있다. ~객체지향~

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();
        
        Animal dog2 = dog;
        dog2.cry();
//        dog2.swim(); // compile error
    }
}

오버로딩 : 한 클래스 내 동일 메소드를 다수 정의하는 것

조건 : 메소드 이름이 같을 것/ 매개변수의 개수 또는 타입이 다를 것

int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, long c) {
    long result = a + b + c;
    return result;
}

int add(int a, int b) {
    int result = a + b;
    return result;
}
// 오버로딩의 조건에 부합하는 예제입니다.

오버라이딩 : 부모 클래스에서 상속받은 내용을 변경하는 것

조건 :  메소드 이름이 같을 것/ 매개변수가 같을 것/ 반환타입이 같을 것

*다형성 vs 오버라이딩 같이 정리해보기

2. 알고리즘 강의

숙제 :

소수 구하기 + 백준 1929번: 소수 구하기

문자열 뒤집기 + 백준 12954번: 비트 문자열 뒤집기

 

배열 vs 링크드 리스트

  조회 삽입/삭제 데이터추가 결론
배열 O(1) O(N) 빈 공간이 없다면
새로 공간을
할당받아야 한다
데이터 조회가
빈번하다면
배열을 사용하자
링크드 리스트 O(N) O(1) 맨 뒤 노드만 동적으로 추가하면 된다. 삽입/삭제가
빈번하다면
연결 리스트 사용하자

**파이썬 리스트는 배열로 구현했다! -> 연결 리스트/ 배열 두 형태로 모두 사용 가능하다.

 

클래스

파이썬에서 생성자 함수의 이름은 _init_으로 예약돼 있다.

인스턴스 생성: 인스턴스를 할당할 변수 = 인스턴스() in python

생성자는 별도로 호출하지 않아도 인스턴스 생성 시 같이 호출된다. 이해 완

Self : 클래스 메소드 호출 시 첫 인자로 인스턴스를 주는 것

링크드 리스트 구현

노드는 해당 데이터와 다음 노드를 알려주는 표시로 이루어진다.

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

# 3을 가진 Node 를 만드려면 아래와 같이 하면 됩니다!
node = Node(3) # 현재는 next 가 없이 하나의 노드만 있습니다. [3]

first_node = Node(5) # 현재는 next 가 없이 하나의 노드만 있습니다. [5]
second_node = Node(12) # [12] 를 들고 있는 노드를 만듭니다.
first_node.next = second_node # 그리고, [5]의 next 를 [12]로 지정합니다. [5] -> [12]

class LinkedList:
    def __init__(self, value):
        self.head = Node(value)  # head 에 시작하는 Node 를 연결합니다.


linked_list = LinkedList(5)
print(linked_list.head.data) # 5가 출력됩니다!

# 현재 LinkedList 는 (5) 만 존재합니다!

#head 출발, cur는 열차 칸 이동, cur.next = None일 때까지(마지막 칸까지)
class LinkedList:
    def __init__(self, value):
        self.head = Node(value)  # head 에 시작하는 Node 를 연결합니다.

    def append(self, value):     # LinkedList 가장 끝에 있는 노드에 새로운 노드를 연결합니다.
        cur = self.head         
        while cur.next is not None: # cur의 다음이 끝에 갈 때까지 이동합니다. 
            cur = cur.next          
        cur.next = Node(value)

#열차 = 링크드리스트 열차 칸 = 노드 클래스
linked_list = LinkedList(5)
linked_list.append(12)
# 이렇게 되면 5 -> 12 형태로 노드를 연결한 겁니다!
linked_list.append(8)
# 이렇게 되면 5 -> 12 -> 8 형태로 노드를 연결한 겁니다!

3.알고리즘 특강

자료구조 선택기준

더블 링크드 리스트

 

 

728x90