728x90
반응형

JAVA/BASIC 15

자바(JAVA) 추상클래스 (Abstract Class)

추상클래스란 객체를 직접 생성할 수 있는 클래스를 실체 클래스 라고 하는 반면 추상 클래스는 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상클래스 라고 할 수 있다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다. 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성을 가질 수 있다. 추상 클래스의 용도는 다음 두 가지가 있다. 1. 실체 클래스들의 공통된 필드 및 메소드 이름 통일 목적 실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다. 예를 들어 소유자의 이름을 저장하는 필드를 Telephone에서는 owner라고 하고, SmartPhone에서는..

JAVA/BASIC 2023.04.12

자바(JAVA) == 비교연산자와 Object클래스의 equals() 메소드

비교연산자 비교연산자는 일반 데이터 혹은 변수에 저장된 데이터의 값이 같은지, 다른지 조사한다. 참조 타입 변수들 간의 비교 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용한다. 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소값을 비교하는 것이 된다. 동일한 주소 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미이다. 따라서 동일한 객체를 참조하고 있을 경우 동등비교(==)연산의 결과는 true이고 부정비교(!=) 연산 결과는 false가 된다 public class Example { public static void main(String... args) { Car car1 = new Car("블루",12); // 힙영역에 car1 저장 Car car2 = new..

JAVA/BASIC 2023.04.12

자바(JAVA) 인터페이스 디폴트메소드와 정적메소드

인터페이스 인터페이스란 객체의 사용 방법을 정의한 타입이다. 인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다. 특히 자바 8에서는 함수적 인터페이스의 구현 객체를 생성하기 때문에 인터페이스의 중요성이 더욱 커졌다. 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다. 개발 코드가 직접 객체의 메소드를 호출하면 간단한데, 왜 중간에 인터페이스를 두는지 의문점이 생긴다. 그 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다. 인터페이스는..

JAVA/BASIC 2023.04.12

자바(Java) 가변인자 - Main메소드 매개변수 String[] args를 가변인자로 받아보기

인프런의 김영한님의 Spring 강의를 듣던 도중 자바스크립트의 전개식(Spread)와 비슷하게 생긴 문법을 확인하였는데, 이것이 자바다 책이나 명품 JAVA Programming에는 수록되지 않아 한참을 구글링 한 끝에 해당 문법에 대해서 찾게되었다. 자바 1.5부터 지원하고 있는 가변인자(Varargs) 라는 문법인데 이는 하나의 함수에서 매개변수를 동적으로 받을수 있는 방법이다. 매개변수의 갯수가 3개 혹은 5개 심지어 아무것도 넘기지않고 호출할 경우에도 적용이되어 사용이 가능하다. 메소드 오버로딩에서는 String 타입의 매개변수를 1개를 넘기거나 2개를 넘길때처럼 매개변수의 갯수에 따라 동일한 이름의 메소드를 여러개 정의해두고 이를 호출하는 방식으로 사용을 하지만, 이것은 제한적이다. 동일한 타..

JAVA/BASIC 2023.04.12

자바(JAVA) 중첩클래스 - 로컬클래스와 익명객체의 로컬변수의 사용제한

로컬클래스란 메소드 내부에서 선언되는 중첩 클래스를 말한다. 메소드가 호출되어 실행되고 있을 때만 객체로 생성되어 사용할 수 있다. 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문에 접근제한자(private, public) 및 static을 붙일 수 없다. 따라서 로컬클래스 내부에는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다. void method() { class D { D() {} //생성자 int field1; //인스턴스 필드 static int field2; //정적 필드 void method1() {} //인스턴스 메소드 static void method2() {} //정적 메소드 } D d = new D(); d.field1 = 3; d.met..

JAVA/BASIC 2023.04.11

이것이 자바다 Reflection - newInstance() 및 ArgumentsConstrouctor 객체 생성법

Reflection 동적 객체 생성 Class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할 수 있다. 이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우에 매우 유용하게 사용한다. 아래 코드처럼 Class.forName() 메소드로 Class객체를 얻은 뒤 newInstance() 메소드를 호출하면 Object 타입의 객체를 얻을 수 있다. public class Example { public static void main(String[] args) throws Exception { Class clazz = Class.forName("example.basic.Car"); Object objCar = clazz.newInstance..

JAVA/BASIC 2023.04.11

자바(JAVA) Exception 예외처리에서 Try Catch 구문의 Finally의 필요성

Try Catch 예외처리 구문을 공부하던 도중 Finally에 대해서 알게 되었다. Finally란 Try ~ Catch 구문의 예외 처리 도중, 예외 발생 여부와 상관 없이 항상 실행할 내용이 있을 경우에만 작성하는 블록이다. 공부를 하면서 문득 이런 생각이 들었다. 항상 실행시키고자 하는 코드는 try catch 구문 블럭이 끝난 이후 블럭 바깥 라인에 작성해도 오류가 발생하든 발생하지 않든 실행이 되는데 굳이 finally가 필요한 상황이 있긴 할까? 라는 의문이다. 우선 Finally 구문을 사용하는 경우에 대해서 예를 들어보자. 보통의 경우 리소스 관리나 프로그램을 안전하게 구성하기 위해 finally라는 기능을 흔히 사용한다. DB Connection 반환 혹은 Socket통신, Close ..

JAVA/BASIC 2023.04.10

자바(JAVA) 예외(Exception) Checked Exception과 UnChecked Exception

Checked Exception (일반 예외) RuntimeEception 자신을 포함하여 상속받지 않은 모든 Exception들이 해당됩니다. (최상위 Exception 또한 Checked Exception에 해당) 다시말해 Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스들입니다. 이것이 자바다 책에서는 일반 예외라고 설명합니다. 자바 소스를 컴파일 하는 과정에서 예외처리 코드가 필요한지 검사하기 때문에 컴파일러 체크 예외라고도 합니다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생합니다. 예외처리 필요 유무는 IDE가 판단해주고 무조건 try-catch나 throws로 예외를 처리하라고 강제합니다. 또한 이 예외가 발생할 경우 기본적으로 transaction처리..

JAVA/BASIC 2023.04.10

자바 Object 클래스 객체복제 (얇은복제)

객체 복제란 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것을 말합니다. 객체를 복제하는 이유는 원본 객체를 안전하게 보호하기 위해서 입니다. 신뢰하지 않는 영역으로 원본 객체를 넘겨 작업할 경우 원본 객체의 데이터가 훼손될 수 있습니다. 따라서 복제된 객체를 만들어 신뢰하지 않는 영역으로 넘기는 것이 좋습니다. 복제된 객체의 데이터가 훼손되더라도 원본 객체는 아무런 영향을 받지 않기 때문에 안전하게 데이터를 보호할 수 있게 됩니다. 객체를 복제하는 방법에는 얕은 복제와 깊은 복제가 있으며 얕은 복제에 대해서 가볍게 알아보도록 합니다. 얕은복제(thin clone) 단순히 필드 값을 복사해서 객체를 복제하는 것을 말합니다. 필드값만 복제하기 때문에 필드가 기본 타입일 경우 값 복사가 ..

JAVA/BASIC 2023.04.10

JAVA Generic 제네릭 (2) / 제한된 타입 파라미터, 와일드카드 타입, 제네릭 타입의 상속과 구현

제한된 타입 파라미터 () 타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 종종 있다. 숫자를 연산하는 제네릭 메소드는 매개값으로 Number타입 또는 하위 클래스타입(Byte, Short, Integer, Long, Double, Float)의 인스턴스만 가져와야 한다. 이것이 제한된 타입 파라미터 (Bounded Type Parameter)가 필요한 이유이다. 제한된 타입 파라미터를 선언하려면 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다. 상위 타입은 클래스 뿐만아니라 인터페이스도 가능하다. 인터페이스라고 해서 implements를 사용하지 않는다. public 리턴타입 메소드(매개변수, ...) {...} 타입 파라미터에 저장되는 구체적인 타입은 상위 타입이거..

JAVA/BASIC 2023.03.12

JAVA Generic 제네릭 (1) / 제네릭 타입, 멀티 타입 파라미터, 제네릭 메소드

Generic이란 Java 5 부터 추가된 문법으로, 잘못된 타입이 사용될 수 있는 문제를 컴파일러 과정에서 제거할 수 있게 한다. 컬렉션, 람다식, 스트림, NIO에서 널리 사용된다. API Documents에는 제네릭 표현이 많기 때문에 제네릭을 정확히 이해해야만 API Docs를 정확히 이해할 수 있다. 클래스와, 인터페이스 그리고 메소드를 정의할 때 타입(Type)을 파라미터(Parameter)로 사용할 수 있도록 한다. 타입파라미터는 코드 작성시 구체적인 타입으로 대체되어 다양한 코드를 생성하도록 해준다. 컴파일 시 강한 타입체크 자바 컴파일러는 코드에서 잘못 사용된 타입 때문에 발생하는 문제점을 제거하기 위해 제너릭 코드에 대해 강한 타입체크를 한다. 실행시 타입 에러가 나지 않도록 컴파일 시..

JAVA/BASIC 2023.03.10

람다식과 인터페이스 익명구현 객체

람다식 자바는 객체 지향 프로그래밍이 소프트웨어 개발의 주요 패러다임이었던 1990년대에 디자인 되었다. 객체 지향 프로그래밍이 나오기 오래 전부터 Lisp 또는 Scheme와 같은 함수적 프로그래밍 언어들이 있었다. 하지만 학계를 제외하고는 현업에서는 큰 호응을 얻지 못하였다. 최근 함수적 프로그래밍이 다시 부각되고 있는데, 병렬 처리와 이벤트 지향 프로그래밍에 적합하기 때문이다. 따라서 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합함으로써 더욱 효율적인 프로그래밍이 될 수 있도록 프로그램 개발 언어가 변하고 있다. 자바는 함수적 프로그래밍을 위해 자바 8부터 람다식(Lambda Expressions)을 지원하면서 기존의 코드 패턴이 많이 달라졌다. 람다식은 수학자 알론조 처치(Alonzo Churc..

JAVA/BASIC 2022.10.27

Static 정적 멤버(변수,메서드 등)

* 메모리 영역별 그림은 추후에 꼭 추가하여 예시 별로 이해를 돕도록 할 예정입니다. * 클래스(static정적)/인스턴스 메서드가 생성되는 메모리 영역차이와 호출할때 접근방식에 따른 시간적 효율 메서드 호출법 #.직접호출 메서드명(인자값) : 내 자신(메인) 클래스 내에 정적 메서드를 선언해주면 메인클래스내의 정적 메인 메서드에서 직접적인 호출 즉, 메서드명(인자값); 호출이 가능해집니다. public class StaticEx2 { public static String method(){ return "궁찬이"; } public static void main(String[] args) { /* main메서드 내에서 같은 클래스(내 자신 클래스)의 필드 메서드 (static메서드)의 호출형태. 클래스와 ..

JAVA/BASIC 2021.05.09

클래스간 상속관계에서 Final로 인한 메서드오버라이딩 제한

부모 자식 클래스간 상속관계에서 자식클래스에 Final이 선언되어있으면 부모의메서드의 오버라이딩을 제한합니다 I/O기반 입출력 스트림을 배우다가 갑자기 컴파일오류가 발생했습니다 15번째 라인에 선언된 코드 myOut.print("메롱"); 에서 빨갛게 밑줄이 뜬게 보이시죠? print()메서드가 myOuy객체에 접근하지못하고 컴파일오류가 발생하게 된 것입니다. import java.lang.*; System.out.print(); 우리가 자바를 가장 처음 배울때 문자를 출력하는것으로 처음 걸음마를 때곤 하는데 출력을 해주는 코드가 바로 System.out.print(); 입니다. System.out.print()코드중에 가장 뒤에 선언된 print() 메서드 안에 따옴표와함께 변수,객체 혹은 문자열을 넣..

JAVA/BASIC 2021.05.06