본문 바로가기

gyub's 공부일기

(41)
interface 사용 이유 1. Cooperation (협업) 예를 들어 우리는 한국인을 위한 번역기를 만들어 볼거에요. 아 전세계 언어가 너무 많아요ㅠㅠ 그래서 업무를 나눠봤어요. "너는 영어 번역 클래스를 만들어, 난 중국어 번역 클래스를 만들게. 준비~ 시작!" 하고 각자 다 만들어서 결과물을 공유했어요. 아래와 같은 결과물이 나왔어요. /** * @author 팀원1 */ public class EnglishTrans { public String koreanToEnglish(String str) { //TODO: 한국어를 영어로 번역 } public String englishToKorean(String str) { //TODO: 영어를 한국어로 번역 } } 다른 친구가 만든 클래스를 볼게요. /** * @author 팀원2..
자바에서 클래스 다중상속을 막은 이유 ※※ 그저 공부하는 흐름대로 작성한 것이니 정돈된 글이 아님 주의 ※※ 클래스 다중 상속에는 여러가지 문제가 내재되어 있다. 예를 들어 변수명 충돌이나 중복된 클래스 상속으로 인해 오버라이딩이 모호한 다이아몬드 문제가 대표적이다. 무엇보다 자바는 객체지향언어이기에 다중상속을 지원하면 객체지향이 무너질 수 있다. 객체지향의 단일책임 원칙에 의해 클래스는 오직 하나의 기능을 가지고 그 하나의 책임에 집중해야되며, 리스코브 치환 원칙에 따라 자식 클래스를 몰라도 부모 클래스의 함수를 사용할 수 있도록 대치가 가능해야 한다. 하지만 다중상속을 허용하면 클래스의 성질이 복합적으로 섞여 부모와 IS-A 관계가 모호해져 정체성이 불분명해질 수 있다. 이것은 위 객체지향 원칙에 위배되기에 이런 문제를 막고자 다중상속을..
ListView vs RecyclerView ※※ 그저 공부하는 흐름대로 작성한 것이니 정돈된 글이 아님 주의 ※※ ListView의 문제점 1. ViewHolder Pattern 을 강요하지 않는다. ListView는 이름에서도 알 수 있듯이 리스트 즉, 목록을 구현하는데 사용된다. ListView는 안드로이드에 임베디드 되어 있는 코드로 동작하며, API level 1부터 존재했다. 위의 형태는 가장 일반적인 ListView의 getView() 접근 방법이다. 하지만 위와 같이 동작하게 되면 getView() 즉, ListView의 재사용성이 떨어지게 된다. @Override public View getView(final int position, View convertView, ViewGroup parent) { Holder holder = n..
Lambda식이란 ※※ 그저 공부하는 흐름대로 작성한 것이니 정돈된 글이 아님 주의 ※※ Lambda 식이란 Lambda 는 함수에 대한 이론적 기반을 세우는 수학적 추상화를 뜻하고 이것을 프로그래밍에 녹여서 표현한 것이 Lambda 표현식이다. 프로그래밍에서 Lambda 에 근간을 두어 설계한 패러다임이 함수형 프로그래밍이다. 함수형 프로그래밍은 함수의 입력만을 의존하여 출력을 만드는 프로그래밍 패러다임이다. 함수 개념에 근간을 두어 설계하였기에 다음과 같은 특징을 가진다. 함수를 객체로 사용함으로써 값으로 할당하거나 파라미터로 전달이 가능하다. (고계함수) 함수를 불변상태로 규정하여 부작용을 최소화하고 멀티 스레드 환경에서 동기성 문제에 안전하다. (순수함수) 코드를 간결하게 하여 가독성을 높임으로써 로직에 집중시킨다..
Java 메모리 구조 Heap, Data, Stack Java 메모리구조 Heap, Data, Stack Java 는 Java 코드를 컴파일러를 통해 바이트코드로 변환시킨 뒤 JVM 위에 실행시키는 구조 JVM은 자바 바이트코드를 실행시키는 가상머신으로서 자바가 플랫폼에 독립적으로 실행될 수 있게 한다. JVM 구조에는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Areas 가 있다. Class Loader 컴파일러에 의해 바이트코드로 변환된 코드를 Runtime Data Areas 에 클래스 단위로 로드 -> Link 를 통해 적절히 배치시키는 작업 Class Loader 로 인해 동적으로 클래스를 로드할 수 있다. Execution Engine Runtime Data Areas 에 배..
제네릭 ※※ 그저 공부하는 흐름대로 작성한 것이니 정돈된 글이 아님 주의 ※※ 제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법. 제네릭을 사용하는 이유는 확장성과 타입 안전성 때문. 기능을 구현할 때 제네릭을 사용하면 다양한 자료형에 적용이 가능하여 확장성을 보장할 수 있다. 이러한 특징은 Object를 통해서도 보장이 가능하지만 Object는 타입에 대한 검사가 이뤄지지 않기 때문에 컴파일 타임에 문제를 인지할 수 없다. 따라서 잘못된 타입이 적용되었을 경우 에러를 잡기가 힘들다. 반면 제네릭은 사용하고자하는 자료형을 명시적으로 표시함으로써 잘못된 자료형을 컴파일 타임에 찾을 수 있다. 비록 제네릭은 생략될 수 있기 때문에 명시적인 자료형 선언 없이도 사용이 가능하여 타입 안전성이 무너..
Iterator ※※ 그저 공부하는 흐름대로 작성한 것이니 정돈된 글이 아님 주의 ※※ Iterator란? Iterator는 내부 구현에 대한 이해 없이 데이터를 순차적으로 탐색할 수 있도록 지원하는 인터페이스이다. 데이터의 내부 구조를 모르더라도 next() 메서드를 통해 순차 탐색이 가능하다. LinkedList, HashMap을 구성하는 구체적인 자료구조(Node 나 Entry)를 모르더라도 Iterator를 사용하면 원하는 정보를 가져올 수 있다. 따라서 내부 구조를 숨길 수 있어 정보은닉이 보장되고 Iterator 인터페이스를 각 자료구조에 맞게 오버라이딩함으로써 다형성을 보장한다. erinyees.tistory.com/21
Vector vs ArrayList vs LinkedList Vector Vector는 배열의 동적인 사용을 위해 제공되는 클래스 내부적으로 synchronized를 통해 구현되어 있기 때문에 동기화를 보장. ArrayList와 LinkedList는 List 인터페이스를 구현한 Collection 구현체이다. List 인터페이스는 기본생성시 동기화를 보장하지 않지만 동기화가 필요한 환경에서는 Collections 클래스를 통해 동기화를 보장할 수 있음. Collection.synchronizedList(List list); 동기화란? 자바에서 동기화란 여러 개의 스레드가 한 개의 자원을 사용하고자 할 때 해당 스레드만 제외하고 나머지는 접근을 못하도록 막는 것. ArrayList 내부적으로 데이터를 배열에서 관리하며 추가, 삭제 시 임시 배열을 생성하여 데이터를 ..