▸JAVA97 열거형 클래스 (Enum Class) [ 열거형 클래스(enum class) ] 상수(final) 전용 클래스 코드는 짧고 의미를 강하게 하는 효과가 있음 정해진 상수를 매개변수로 받아야 하는 메소드의 매개변수를 강제할 수 있음 조금 어려운 개념인데 위의 세 가지 항목을 예시와 함께 정리해보겠습니다. 상세한 클래스 메소드 사용법은 아래 링크를 참조하시면 됩니다. 2019/12/10 - [JAVA/라이브러리(API)] - java.lang.Enum (열거형) 주요 메소드 [1/1] 상수(미리 정해진 값)을 사용하는 경우, 먼저 final 필드를 사용하는 방법이 있습니다. 예를 들어 제품 종류에 따른 크기와 색깔이 정해진 상수를 모아둔 클래스가 있고, 이를 필요로 하는 다른 클래스에서 가져다가 출력해주는 메소드가 있다고 가정해보겠습니다. 아래.. ▸JAVA/기본 문법 2019. 12. 10. 익명 클래스 (Anonymous Class) [ 익명 클래스 ] 별도의 클래스를 만들지 않고 인스턴스 생성과 동시에 오버라이딩 수행 일회성 오버라이딩이라고 할 수 있음 본래 한 클래스에 있는 메소드를 오버라이딩 하기 위해서는 다른 클래스에서 상속 후 오버라이딩 해야합니다. 하지만 일회성으로 오버라이딩을 하기 위해 상속받은 클래스를 새로 만드는 것은 매우 비효율적입니다. 이럴 경우 인스턴스 생성과 동시에 필요한 부분을 오버라이딩 하는 방법이 익명 클래스입니다. 문법은 간단합니다. 클래스 하나를 인스턴스로 만들고 대괄호를 열고 닫아서 필요한 부분을 오버라이딩 하면 됩니다. 대괄호 뒤에는 세미콜론(;)이 붙어야 합니다. 오버라이딩만 가능하고 새로운 메소드를 추가할 수는 없습니다. package study.first; public class Study .. ▸JAVA/기본 문법 2019. 12. 10. 내부 클래스 (Inner Class) [ 내부 클래스란? ] 클래스 또는 메소드 내부에 생성된 클래스 내부 클래스를 포함한 클래스를 외부 클래스(Outer Class)라고 함 하나의 클래스 또는 메소드에서만 사용되는 클래스가 필요할 때 사용 간단히 말하면, C언어에서 특정 함수에서만 필요한 구조체 선언을 굳이 메인 함수가 있는 곳에 하지 않고 해당 함수가 있는 곳에 따로 하는 것과 비슷한 행위입니다. Java에서는 모든 것이 클래스 단위이기 때문에 필요한 부분에다가 클래스 정의를 해주면 됩니다. 메모리 구조가 머릿속에 잘 그려져 있으면 어렵지 않게 사용이 가능합니다. [ 인스턴스 멤버 클래스 ] static이 없고, 인스턴스를 생성해줘야 하는 일반 클래스 형태의 내부 클래스 가장 일반적인 형태입니다. static을 붙이지 않았기 때문에 .. ▸JAVA/기본 문법 2019. 12. 10. 가변 길이 인수로 메소드 정의하기 [ 가변 길이 인수란? ] 메소드 파라미터를 길이가 정해져 있지 않은 배열로 받을 수 있도록 함 정확히 정해져있지 않은 갯수의 매개변수를 받아야할 때 사용 가변 길이 인수를 사용한 메소드 parameter 정의는 C언어에 없는 편리한 기능 중 하나 입니다. 물론 아주 복잡한 방법으로 구현은 할 수 있습니다. Java도 내부적으로는 분명 복잡하게 설계돼 있을 것 같긴 하지만 일단 사용은 매우 편리합니다. 두 가지 방법이 있습니다. 우리가 항상 이클립스에서 자동 생성해주는 main함수에서 볼 수 있듯이 그냥 parameter를 배열로 지정하는 것입니다. 하지만 메모리 구조에서 봤듯이, 배열(참조변수)을 함수의 인자값으로 넣어서 전달하면 결국 힙 영역에 있는 메모리 주소의 주소값만 전달해줍니다. 즉, 객체를.. ▸JAVA/기본 문법 2019. 12. 10. 2차원배열_생성/초기화/사이즈변경/출력 [2/2] 2차원 배열도 1차원 배열과 마찬가지고 C언어의 사용법과 크게 다른 점은 없습니다. 하지만 약간 다른점이 있어서 간단히 정리해보겠습니다. 일단 기본적인 형태의 2차원 배열은 아래와 같이 작성하면 됩니다. 추가로 Java에서는 행과 열을 배열.length로 따로 구해줄 수 있어서 편리하게 사용이 가능합니다. package study.first; public class Main { public static void main(String[] args) { int[][] arr = {{0,1,2},{3,4,5}}; for(int i = 0; i < arr.length; i++) { for(int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " ".. ▸JAVA/기본 문법 2019. 12. 10. 1차원배열_생성/초기화/사이즈변경/출력 [1/2] 기본적으로 C언어의 배열과 비슷한 개념이고 비슷한 구조를 가지고 있습니다. 다만 C언어보다 조금 더 기능이 많고 특히 Arrays 클래스에 포함되어 있는 편리한 메소드가 많습니다. [ 배열 생성 및 초기화 ] 필드의 경우 값을 주지 않고 생성만 하면 해당 타입의 기본값이 들어갑니다. 정수형이나 실수형이라면 0이 기본값이 될 것이고, 문자열이나 객체라면 null값이 기본입니다. 여러 가지 방법으로 생성 및 초기화가 가능합니다. 직접 값을 하나씩 넣거나 반복문으로 처리하는 초기화는 제외했습니다. 참고로 메소드 내에서 생성되어 스택 영역에 생기는 변수는 초기화가 자동으로 되지 않으니 꼭 직접 초기화를 해줘야 합니다. package study.first; public class Main { public st.. ▸JAVA/기본 문법 2019. 12. 10. 객체 값 출력_toString 메소드 오버라이딩 [ toString 메소드 ] 기본 상속된 Object 클래스의 메소드 객체가 가진 정보를 문자열로 만들어 출력 인스턴스 출력 시 Object.hashCode()로 생성된 해시값을 문자열로 반환시켜줌 인스턴스의 값을 출력할 때 그냥 인스턴스를 넣거나 기본 toString()메소드를 사용하면 해시값을 포함한 이상한 값이 출력됩니다. 만들어 둔 인스턴스의 정보를 편하게 출력하기 위해 toString()메소드를 오버라이딩 해두면 편리합니다. 먼저 기본 Object.toString()를 사용해서 인스턴스 하나를 출력해본 결과입니다. 그냥 인스턴스만 넣어도 동일하게 작동합니다. package study.first; public class Main { public static void main(String[] a.. ▸JAVA/기본 문법 2019. 12. 10. 객체의 등가성(객체 비교)_hashCode 메소드 [4/4] [ hashCode 메소드 ] 객체 내부의 필드 값을 hash값으로 바꿔 hash값을 리턴해줌 같은 값은 무조건 동일 hash값을 가짐 하지만 hash값이 동일하더라도 값이 다를 수 있기 때문에 equals 메소드와 혼용 필수 equals 메소드보다 비교 연산이 빠르기 때문에 hashCode를 먼저 비교 후 equals 수행 동일한 객체는 무조건 같은 hash값을 가지지만 낮은 확률로 서로 다른 두 객체가 같은 hash값을 가질 수도 있습니다. 따라서 hashCode 메소드를 통해 동일한 hash값이 도출되면 equals 메소드를 다시 수행해 값을 비교해줍니다. 이렇게 하는 이유는 hash값을 도출하는 연산이 더 빨라서 값이 다른 객체는 대부분 hashCode에서 걸러낼 수 있기 때문입니다. 추가로 같.. ▸JAVA/기본 문법 2019. 12. 10. 객체의 등가성(객체 비교)_equals 메소드 [3/4] [ equals 메소드 ] 객체 내부의 값을 모두 비교해 동일 값을 가진 객체를 판별하는 메소드 equals 메소드는 모든 클래스의 기본적인 부모 클래스가 되는 Object 클래스 포함된 메소드입니다. 하지만 기본 메소드를 그대로 사용할 경우 올바른 비교가 되지 않기 때문에 실제 사용 시에는 해당 클래스에 맞도록 오버라이딩 해서 사용해줍니다. 물론 오버라이딩 하지 않고 다른 함수를 만들어 사용해도 무방합니다만, 혼선을 방지하기 위해 그냥 오버라이딩을 해주는 쪽이 좋습니다. 먼저 Object에 포함된 기본 equals 메소드의 코드를 보면 객체 자체를 관계 연산자(==)로 비교합니다. 따라서 내부적으로 같은 값을 가진 객체 2개라도 다른 메모리 주소를 가지기 때문에 서로 다른 값으로 인식합니다. 자기 자.. ▸JAVA/기본 문법 2019. 12. 10. 객체의 등가성(객체 비교)_instanceof 타입 비교 [2/4] [ instanceof ] 해당 객체의 타입 판별 상속받은 부모 클래스도 같은 객체 타입으로 판단 instanceof는 좌측의 객체가 우측의 타입이 맞는지 확인해 줍니다. 자식클래스는 부모클래스의 타입이기 때문에 "자식클래스 객체 instanceof 부모클래스 타입"은 true가 됩니다. 하지만 당연히 반대는 성립하지 않습니다. 기준이 되는 좌측은 인스턴스가, 우측은 인스턴스가 아닌 타입이 명시돼야 합니다. 참고로 조건문에서 instanceof를 사용해 타입을 판별한 후, 해당 클래스의 메소드를 따로 호출하는 것은 객체지향 관점에서는 그리 좋지 못한 방식입니다. 그것보다는 오버라이딩을 사용해 같은 메소드를 가진 뒤, 객체만 호출하고 오버라이딩된 메소드를 실행하는 것이 보다 효율적입니다. package.. ▸JAVA/기본 문법 2019. 12. 10. 객체의 등가성(객체 비교)_관계 연산자(==) 비교 [1/4] [ 관계 연산자(==) 비교 ] 기본 변수(원시타입)일 경우 값을 비교 참조 변수(원시타입 외)일 경우 값이 아닌 저장된 주소(포인터)를 비교 ※ 원시타입(primitive) 변수 1. 논리타입 : boolean 2. 정수타입 : byte, short, int, long 3. 실수타입 : float, double 4. 문자타입 : char 관계 연산자(==) 좌우에 원시타입 변수가 하나라도 있으면 "값"을 비교해 줍니다. 아래와 같이 정수를 비교했을 때 일반 변수와 다른 객체의 값을 비교하더라도 같은 값으로 인식하고 있습니다. 하지만 객체(참조변수)와 객체를 비교했을 때는 다른 값으로 인식합니다. 객체간의 비교는 값 자체가 아닌 값이 저장된 포인터 "주소"를 비교하고, 서로 다른 객체는 다른 메모리 주소.. ▸JAVA/기본 문법 2019. 12. 10. 다형성의 활용 (오버라이딩) 게임에서 각 캐릭터가 각자 주어진 무기를 들고 발사하는 프로그램을 만든다고 가정해 보겠습니다. 절차지향언어인 C언어에서는 각 캐릭터(변수)에 맞춰서 무기를 발사(함수)하도록 합니다. 하지만 객체지향언어인 Java에서는 각 캐릭터마다 자신의 무기를 이미 가지고 있고(클래스), 어떻게 발사해야할지(메소드)도 미리 알고 있습니다. 따라서 C언어에서는 캐릭터를 먼저 소환한 후 무기 발사를 명령해야하지만(절차대로) Java에서는 무기를 발사한다라는 명령을 내려두고 캐릭터를 소환합니다. 그럼 그 캐릭터가 알아서 자신의 무기를 발사하게 됩니다. 그래서 객체지향언어인 것이죠. 이렇게 미리 명령을 내려 두고 캐릭터를 소환해주기 위해 사용하는 방식이 다형성의 성질 중 하나인 오버라이딩입니다. 먼저 위의 예시를 구현하기.. ▸JAVA/기본 문법 2019. 12. 10. 인터페이스와 다중 상속 인터페이스는 추상과 비슷한 개념이지만 오직 설계만을 위한 구조라는 점에서 클래스라고 하지 않고 인터페이스라고 부릅니다. 추상 클래스 또는 인터페이스가 되는 것이죠. 사용법은 간단합니다. 앞에 클래스 대신 인터페이스로 정의해주고 설계도를 작성한 후, 다른 클래스에서 상속받는 것입니다. 쓰는 용어가 다를 뿐 추상 클래스와 거의 동일한 형태입니다. 다만 아래와 같은 차이점이 있습니다. [ 추상 클래스] 다중 상속 불가 일반 메소드(정의 된 메소드)와 추상 메소드 혼용 가능 변수는 상속되어 값을 변경할 수 있음 [ 인터페이스 ] 다중 상속 가능 정의 되지 않은 추상 메소드만 사용 가능 초기화된 변수만 사용 가능하며 상속된 변수는 상수로 취급 (값을 변경할 수 없음) 즉, 추상 클래스는 내용과 껍데기가 동.. ▸JAVA/기본 문법 2019. 12. 10. 애노테이션(annotation) [ 애노테이션이란? ] 클래스나 메소드에 특정 역할 또는 의미 등을 부여할 수 있도록 하는 기능 간단히 말해 애노테이션은 해당 코드를 IDE(이클립스) 또는 컴파일러가 체크할 수 있도록 해주는 기능입니다. 대표적인 표준 API로는 @Overide, @Deprecated, @SuppressWarnings가 있습니다. [ @Overide ] 만약 해당 메소드가 오버라이드가 아니라면 경고 (컴파일 에러) 실제로 오버라이딩이 되는지 체크하는 애노테이션입니다. 무언가를 오버라이딩하려고 만든 함수인데 이름을 잘 못 써서 새로 만들어버리거나 하는 등의 실수를 방지하기 위한 기능입니다. 또한 다른 사람이 봤을 때도 한눈에 오버라이딩 된 메소드라는 것을 파악할 수 있게 됩니다. [ @Deprecated ] 해당 변.. ▸JAVA/기본 문법 2019. 12. 10. 추상 (abstract) 클래스와 메소드 추상 클래스는 부모클래스 전용으로, 메소드 구조만 잡아주고 자식 클래스에서 각자 정의해서 쓰도록 하는 클래스의 종류입니다. 즉 추상 클래스를 상속받은 자식 클래스는, 추상 클래스에서 정의한 추상 메소드를 무조건 오버라이딩해서 완성시켜야 합니다. 다른 사람들과 코드를 같이 짤 때도 유용하게 쓸 수 있고 혼자 짜더라도 보다 클래스 관리를 체계적으로 할 수 있습니다. 메소드를 완성시키지 않고 추상 메소드로 두려면 무조건 클래스 자체를 추상(abstract) 클래스로 만들어야 합니다. 추상 클래스가 아닌 경우 추상 메소드 또한 사용이 불가합니다. 하지만 추상 클래스 내에서 정의가 완료된 (추상 메소드가 아닌) 메소드는 상속 받아 바로 사용이 가능합니다. 추상 클래스란 곧 아직 완성되지 않은 클래스라는 의미입.. ▸JAVA/기본 문법 2019. 12. 10. 이전 1 2 3 4 5 6 7 다음 💲 추천 글 반응형