글

라벨이 Java인 게시물 표시

[JAVA] Generic이란 무엇인가?

Generic 제네릭이란 데이터 타입을 일반화한다는 것을 의미한다. 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 것이다. *JDK 1.5 이전에는 여러 타입을 사용하는 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했었다. 이 경우 반환된 Object 객체를 다시 원하는 타입으로 변환해야 했으며, 이때 오류가 발생할 가능성이 존재한다. JDK1.5 부터 도입된 제네릭을 활용하면 컴파일 시 미리 타입이 정해지므로, 타입검사나 타입 변환과 같은 번거로운 작업을 생략할수 있게 된다. 예제 class MyArray< T > { T element ; void setElement ( T element){ this . element = element ; } T getElement () { return element ; } } 예제에 나오는 'T' 를 타입변수라고 하며, 임의의 참조형 타입을 의미한다. - T 뿐만 아니라 어떠한 문자를 사용해도 상관없음 - 여러개의 타입변수를 쉼표로 구분하여 명시 가능 타입변수는 클래스 뿐만아니라 메소드의 매개변수나 반환값으로도 사용할 수 있다. main() 출력 MyArray<Integer> myArray = new MyArray<Integer>() ; myArray.setElement( 1 ) ; //myArray.setElement(" 문자 "); --> error System. out .println(myArray.getElement()) ; // 1 제네릭 클래스를 생성할 때에는 타입변수 자리에 실제 타입을 명시해야한다. 이렇게 실제 타입을 명시하면, 내부적으로 정의된 타입 변수가 명시된 실제 타입으로 변환되어 처리된다. Java SE7 이상 MyArray<String> myArray1...

[JAVA] Hash란 무엇인가?

Hash? ArrayList는 내부 인덱스를 이용하여 검색이 한번에 이루어지기 때문에 빠른 검색 속도를 보장하는 반면 데이터의 추가/삭제시 많은 데이터가 밀리거나 당겨지기 때문에 많은 시간이 소요된다. LinkedList는 추가/삭제시 인근 노드들의 참조값만 수정해 줌으로써 빠른 처리가 가능하지만 데이터를 검색할 경우 해당 노드를 찾기 위해 처음부터 순회 검색을 해야하기 때문에 데이터의 수가 많아질수록 효율이 떨어지는 구조이다. *이러한 한계를 극복하기 위해서 제시된 방법이 Hash이다. Hash는 내부적으로 배열을 사용하여 데이터를 저장하기 때문에 빠른 검색속도를 갖는다. 그리고 데이터 추가/삭제시 기존 데이터를 밀어내거나 당기는 작업이 필요없도록 특별한 알고리즘을 이용하여 데이터와 연관된 고유한 숫자를 만들어 낸 뒤 이를 인덱스로 사용한다. 특정 데이터가 저장되는 인덱스를 그 데이터만의 고유한 위치로 정하여서 데이터 추가/삭제시 데이터의 이동이 없도록 만들어진 구조이다. Hash가 내부적으로 사용하는 배열을 Hash Table 이라고 하며 크기에 따라 성능차이가 날 수 있다. Hash Table key-value 에서 key를 테이블에 저장할 때 key값을 Hash Method를 이용해 계산을 수행한 후, 그 결과값을 배열의 인덱스로 사용하여 저장하는 방식이다. 여기서 key값을 계산하는 것이 Hash Method 이다. Hash Method Hash는 특별한 알고리즘을 이용하여 데이터의 고유한 숫자값을 만들어 인덱스로 사용한다고 했다. 이 알고리즘을 구현한 메소드를 Hash Method라고 하며 Hash Method에 의해 반환된 데이터의 고유 숫자값을 Hash Code 라고한다. *자바에서는 Object 클래스의 hashCode() 메소드를 이용하여 모든 객체의 Hash Code를 쉽게 구할 수 있다. *Hash Method를 이용해서 데이터를 Hash Table에 저장하고 검색하는 기법을 Hashing이라 한다...

[JAVA] MAP의 자료구조

MAP 맵은 사전과 비슷하다. people이란 단어에 "사람", baseball이란 단어에 "야구"라는 뜻이 부합되듯이 Map은 Key와 Value라는 것을 한 쌍으로 갖는 자료형이다. 맵은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 Key를 통해 Value를 얻는다. *맵의 가장 큰 특징은 Key로 Value를 얻어낸다는 것이다. People이라는 단어의 뜻을 찾기 위해서 사전의 내용을 순차적으로 검색하는 것이 아니라 해당 단어가 있는 곳만을 펼쳐 보는 것이다. *맵도 리스트와 마찬가지로 인터페이스다. 맵 인터페이스를 구현한 Map자료형에 HashMap, LinkedHashMap, TreeMap등이 있다. HashMap put() HashMap<String , String> map = new HashMap<String , String>() ; map.put( "people" , " 사람 " ) ; map.put( "baseball" , " 야구 " ) ; key와 value가 String 형태인 HashMap 타입의 map을 만든다. map.put() 안에 key와 value를 입력할 수 있다. get() System. out .println(map.get( "people" )) ; // 사람 System. out .println(map.get( "baseball" )) ; // 야구 value를 얻기위해서는 get() 메소드 안에 key값을 입력하면된다. constainsKey() System. out .println(map.containsKey( "people" )) ; // true System. out .println(map.containsKey( "baseball" )) ; // true S...

[JAVA] Call by value와 Call by reference

Call by value = 값에 의한 호출 프로그래밍 언어에서 변수를 다른 메소드의 인자로 넘겨 줄 수 있다. 이때 변수의 '값'을 넘겨주는 호출 방식을 Call by value 라고한다. 자바는 Call by value 방식으로 동작한다. 예제   static void swap ( int x ,int y){ int tmp = x ; x = y ; y = tmp ; } main() 호출 및 결과 int a = 1 ; int b = 2 ; swap (a , b) ; System. out .println(a) ; // 1 System. out .println(b) ; // 2 swap() 은 입력값 x와 y의 값을 바꾸는 예제이다. a = 1, b = 2가 입력되고 바뀐것이니 println() 을 했을때 바뀌어서 출력될 것 같지만 그대로 출력된다. 입력된 인자 a,b 와 swap() 의 x,y 는 서로 다르기 때문이다. main()에서 선언 된 변수 a,b 각각 의 메모리에 할당 되었다고 생각해 보자. 할당 된 메모리 변수에는 각각 10과 20의 값이 저장된다. 이후 swap() 호출 시 입력한 a,b는 메모리 주소가 아닌 메모리에 담겨져 있던 값만 복사되어 swap() 내부의 x와 y의 메모리 주소에 담겨지게 된다. swap() 이 실행 되더라도 입력된 a,b 는 main의 a,b 가아닌 swap() 내부에 복사되어 새로 생성된 x,y 이기 때문에 수행 후에도 결과 값에 변화가 없는 것이다. *Call by value란 - 메소드 호출 시 입력되는 인자의 메모리 주소가 아닌 메모리에 저장되어 있는 값을 복사하여 보낸다. Call by reference = 참조에 의한 호출 메소드 호출 시 입력하는 인자가 값이 아닌 주소를 넘겨줌으로 써 , 주소를 참조(Reference)하여 데이터를 변경할 수 있다. 자바의 참조형은 Call by reference 인가?...

[JAVA] abstract와 interface의 차이점

추상 메소드 (abstract method) 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 자바에서 추상 메소드를 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다. 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문이다. 추상 메소드는 선언부만 존재하며, 구현부는 작성되어 있지 않다. 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩 하여 사용하는 것이다. 추상 클래스(abstract class) 자바에서 하나 이상의 추상 메소드를 포함하는 클래스를 추상 클래스라고 한다. 이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다. 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 한다. 추상 클래스는 동작이 정의되어있지 않은 추상메소드를 포함하고 있으므로 인스턴스를 생성할 수 없다. 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상 클래스의 모든 추상 메소드를 오버라이딩하고 나서 자식클래스의 인스턴스를 생성할 수 있게 된다. 추상 클래스는 추상 메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다. 생성자와 필드, 일반 메소드도 포함할 수 있다. 예제 abstract class Animal { abstract void cry () ; } class Cat extends Animal { @Override void cry () { System. out .println( " 냐옹 " ) ; } } class Do...