Language 23

인터페이스와 추상클래스 그리고 Enum

1. 인터페이스(interface)란? 한 클래스가 다양한 클래스를 상속받아 다양한 기능을 사용하면 얼마나 좋을까? 하지만 다중 상속을 자바에서는 지원하지 않는다. 그래서 자바에서는 인터페이스를 이용해 다중 상속을 지원하고 있는데, 인터페이스(interface)는 클래스와 달리 객체를 생성할 수 없는, 클래스에서 구현해야하는 일종의 작업 명세서이다. 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상클래스이다. (인터페이스와 상속은 엄연하게 다름!) 상속이 부모 클래스의 기능을 자식 클래스가 물려 받는 것이라고 한다면, 인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다. 일반적으로 인터페이스는 이렇게 구현한다. (추가적으로 인..

Language/Java 2022.05.14

람다식(Lambda)과 함수형 인터페이스(fuctional interface)

1) 람다 표현식(lambda expression) 메소드를 하나의 식으로 표현한 것으로 익명 함수(anouymous fuctions)를 지칭하는 용어이다. 일반적으로 사용하는 함수를 단순하게 표현하는 방법이다. 2)람다의 특징 람다식은 익명 함수의 특징으로 이름을 가질 필요가 없다. 두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다식으로 단순화 가능하다. 람다식으로 선언된 함수는 1급 객체이기 때문에 Stream API의 매개변수로 전달이 가능해진다. 3) 람다의 장점과 단점 장점 단점 1. 코드의 간결함 및 가독성 증가. 람다를 통해 불필요한 코드를 삭제할 수 있으며 이로 인해 단순하게 코드를 표현할 수 있음. 2. 지연연산 수행 람다는 지연연산을 수행 함으로써 불필요한 연산을 최..

Language/Java 2022.01.23

추상 클래스(abstract class)와 인터페이스(interface)

1. 추상 클래스(abstract class) 추상 클래스는 클래스의 공통된 부분을 뽑아 별도의 클래스인 추상 클래스로 만들어놓고 이것을 상속해서 사용한다. 앞서 클래스를 설계도에 비유했는데, 추상 클래스는 미완성 설계도에 비유가 가능하다. 미완성 클래스로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다. 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 추상 클래스의 특징은 다음과 같다. 1. 멤버 변수를 가진다. 2. 추상클래스를 상속하기 위해선 상속 키워드인 extends를 이용한다 3. 추상 메서드를 가지며 상속한 클래스에서 반드시 구현해야 한다. 4. 일반 메서드를 가질 수 있다. 5. 일반 클래스와 마찬가지로 생성자도 있다. 추상 클래스 자체로는 클래스로서의 역할을 ..

Language/Java 2022.01.23

내부 클래스(inner class)

1. 내부클래스(inner class) 내부 클래스는 클래스 내에 선언된 클래스로 두 클래스가 서로 가까운 관계가 있을 때 내부 클래스를 사용한다. 이로인해 멤버에 쉽게 접근할 수 있으며, 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다. (크게 중요하지 않음.) 1) 내부 클래스의 예시 class A{ //외부 클래스 class B{ // 내부 클래스 } } 2) 내부 클래스의 선언 class Outer{ int iv = 0; // 인스턴스 변수 static int cv = 0; // 클래스 변수 void myMethod(){ int iv = 0; //지역 변수 } } 같은 위치에 선언뿐만 아니라 멤버 변수와 같은 성질을 갖는다. 따라서 내부 클래스가 외부 클래스의 멤버와 같이..

Language/Java 2022.01.22

상속(Inheritance)

상속은 기존의 클래스를 재사용해 새로운 클래스를 작성하는 것인데, 적은 양의 코드로 새로운 클래스의 코드를 작성할 수 있고 코드를 공통적으로 관리해 코드의 추가 및 변경이 매우 용이하다. 상속의 장점 1. 코드의 재사용성 증가 2. 중복된 코드의 제거로 인한 생산성의 향상 및 유지보수가 편해짐. 1) 상속의 예시 class Child extends Parent{ // 내용 } 상속받고자 하는 클래스의 이름 뒤에 extends와 상속 받을 클래스 이름을 적는다. 상속은 부모에서 선언과 정의를 모두 하며 자식은 메서드와 변수를 그대로 사용이 가능해 오버라이딩을 따로 할 필요가 없다. (단일상속 = 하나의 클래스에 하나만 상속이 가능하다) 상속을 해주는 클래스를 '조상 클래스' 상속을 받는 클래스를 '자손 클..

Language/Java 2022.01.21

생성자(Constructor)

메서드처럼 클래스 내에 선언되는 '생성자'는 메서드와 유사한 구조를 가지고 있으나 리턴값이 없다는 점이 다르다. 그럼 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 그래서 인스턴스 변수의 초기화 작업에 주로 사용된다. 생성자의 조건은 2가지가 있다. 1. 생성자의 이름은 클래스의 이름과 같아야 한다. 2. 생성자는 리턴 값이 없다. 1) 생성자 예시 class Card{ Card(){//매개변수가 없는 생성자.} Card(String k, int num){// 매개변수가 있는 생성자.} } 2) 생성자 분석 클래스 이름(타입변수 명, 타입변수 명 ***){ // 인스턴스 생성 시 수행될 코드, // 주로 인스턴스 변수의 초기화 코드를 적음. } 생성자도 오버로딩이 가능해 하나의 ..

Language/Java 2022.01.21

오버로딩(overloading)

자바에서는 메서드도 변수와 마찬가지로 같은 클래스 내에 서로 구분이 가능해야한다. (그럼 계속해서 이름을 다르게 사용해야하나?) 정답은 그렇지 않다. 같은 이름이라도 매개변수의 개수, 타입이 다르면 같은 이름을 사용해 메서드를 정의할 수 있다. 이렇게, 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '오버로딩'이라고 한다(중복 메서드) 보면 한 클래스 내에 같은 이름으로 3개의 getInfo가 정의된 것을 볼 수 있는데, 각자 변수의 개수 및 타입이 다르다. 이렇게 오버로딩의 조건은 크게 2가지이다 1. 메서드의 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. 그럼 오버로딩의 장점은 무엇일까? 생각을 해보자. 오버로딩? 우선 효율적일 것이다. 굳이 여러 개의 메서드를 ..

Language/Java 2022.01.20

클래스 메서드(static)와 인스턴스 메서드 (static은 무엇일까)

변수와 마찬가지로, 메서드 앞에 static이 붙어 있으면 클래스 메서드이고, 없으면 인스턴스 메서드이다. (클래스 영역에 선언된 변수를 멤버변수라 하고, 멤버변수 중 static이 붙은 것을 클래스 변수, 붙지 않은 것을 인스턴스 변수라 함. 인스턴스 변수와 static 변수 모두를 통칭하는 말이 멤버 변수!) 그럼 과연 static이 무엇일까? 무엇이길래 유무의 차이로 인해 정의가 바뀌는 것일까? static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다. 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 이와 같은 이유는 하나의 변수를 모든 같은 인스턴스가 공유하기 때문이다. static이 ..

Language/Java 2022.01.20

장독에 지식 채우기 (모를때마다 와서 추가)-(2022.01.17ver)

우연히 Java 관련 알고리즘 문제를 풀고 풀이 과정을 듣는 중 ArrayList라는 클래스가 눈에 보였다. (어... 이거 뭐였지?.. )하는 생각이 내 눈앞에 빠르게 지나갔는데... Array는 배열이였고.. List는 리스트? 그럼 ArrayList는? 뭐였지?... 그래서 풀이를 잠시 중단하고 ArrayList에 대해 짚고 넘어가고자 한다. 1. ArrayList ArrayList는 자바에서 기본적으로 많이 사용되는 클래스로 자바의 List 인터페이스를 상속받은 여러 클래스 중 하나이다. 일반 배열과 동일하게 연속된 메모리 공간을 사용하는데, 배열과 마찬가지로 인덱스는 0부터 시작한다. 차이점은 배열은 크기가 고정이지만, ArrayList는 크기가 가변적으로 변한다. 내부적으로 저장이 가능한 메모..

Language/Java 2022.01.17

Java의 이해(객체와 메모리)

메모리에서 객체를 생성하는데 이를 동적생성이라 한다. 객체는 메모리에서 동적으로 생성되며 객체가 더이상 필요없게되면 GC(Garbage collector)에 의해 제거된다. 자료형이 같아도 다른 공간에 존재하는 객체는 엄연히 다른 객체임을 알고있어야한다. 레퍼런스에서는 원래 객체의 메모리 주소가 있지만 그 부분에 NULL을 넣게되면 NULL이 출력되고 그 후 다시 출력하게 되면 Exceptio 오류가 발생한다.

Language/Java 2022.01.17