728x90

 

없는 값을 체크 할 때 위의 둘을 쓰게 되는데

뭐가 다를까?

 

1. isEmpty()

인스턴스는 생성 되어있는 상태

but 안에 값은 비어있는 상태(정확하게는 ""으로 값이 들어가있는 상태)

    -  null과 공백데이터는 엄연히 다르다

java 1.6버젼에서 추가됨

ex) 빈 항아리

 

2. == null

null은 인스턴스가 생성되지 않은 상태

즉, 아무런 주소값을 가지고 있지 않는 상태이며, 값 자체가 존재하지 않음

ex)항아리 자체가 없음

 

 

 

직접 테스트해보자

// isEmpty() vs == null 차이
String testEmpty = "";
String testNull = null;

// 1. 공백값 & isEmpty() 체크
if(testEmpty.isEmpty()){
    System.out.println("1 : "+testEmpty);
}  

// 2. null & isEmpty() 체크
if(testNull.isEmpty()){
    System.out.println("2 : "+testNull);
} 

// 3. 공백값 & null 체크
if(testEmpty == null){
    System.out.println("3 : " + testEmpty);
}  

// 4. null & null 체크
if(testNull == null){
    System.out.println("4 : "+ testNull);
}

 

 

2번인 13라인에 NullPointerException 발생

공백 값이지만 값을 체크하는 거기 때문에 애초에 값 자체가 들어오지 않았기 때문에 NullPointerException이 발생한 것

 

 

2번을 주석처리하고 다시 돌려보면

조건이 true인 것만 발동하니 1,4번만 출력되는 걸 알 수 있다

3번은 공백에 null을 체크한거라 애초에 인스턴스가 존재하기 때문에 null 자체가 아니니 false이다

 

 

※ 비슷한 주제

 == vs equals

 

728x90
반응형
728x90

 

For each문

= 향상된 for문

= 개선된 for문

 

배열이나 컬렉션의 요소(element)에 대해 특정 작업을 반복적으로 가져오기 위해 사용

for(타입 변수명 : 배열or컬렉션){
		반복할 코드
}

 

특징

자바5.0(JDK 1.5)이상 사용가능

일반적인 for문과 달리 배열과 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용 가능

for each 문은 따로 반복횟수를 명시적으로 주는 것이 불가능하며,

순차적으로 반복될 때만 사용가능

for each문 안에 선언된 변수는 for문 내에서만 사용가능(지역변수 취급)

 

 

장점

1.심플, 가독성Good

2.배열 인덱스 문제 해결

ex) ArrayIndexOutOfBoundsException 예외발생 해결

 

 

단점

1.인덱스를 사용불가x

2.배열 & ArrayList 값을 사용가능하나 수정불가x

 

 

로직

배열or컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀져 변수에 저장됨

변수명을 출력하면 해당 인덱스 배열 요소값이 출력

배열or컬렉션을 처음부터 하나씩 변수명에 대입하여 바디 부분을 실행함

즉, 배열or컬렉션[0]의 값을 변수명에 다시 담아 바디부분을 실행하고 총길이 만큼 for문이 도는 것

 

ex)

for(int num : arrList){
		System.out.println(num);
}

 

아래처럼 a를 al을 두가지 반복 시키면 헷갈리는 부분이 있어서 정리해봤다

  • a를 반복시킬 경우 : 변수 al 전체를 al의 길이만큼 반복
  • al을 반복시킬 경우 : 변수 al의 요소 하나씩 순서대로 al길이만큼 반복

 

 

ex)구체적 예시

 

728x90
반응형
728x90

 

▶ Iterator<E> 인터페이스

컬렉션에 저장된 요소(element)를 읽어오는 표준화된 방법

  • 자바의 collection framework는 컬렉션에 저장된 요소(element)를 읽어오는 방법을 Iterator 인터페이스로 표준화하고 있음

Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근함

즉, Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator() 메소드를 사용

       → iterator() 사용 : List & Set

 

Iterator 인터페이스는 아래 메소드를 사용하여 컬렉션의 각 요소(element)에 접근

 

※ JDK 1.5에 추가된 for each문(Enhanced for문)을 사용하도록 권장

→ 같은 성능을 유지하면서도 코드의 명확성을 확보하고 발생할 수 있는 버그를 예방

For each문 링크 : https://rise-up.tistory.com/777

 

ListIterator<E> 인터페이스

JDK 1.2에 추가됨

Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스

 

사용 조건

List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator() 메소드를 통해 사용

 

ListIterator & Iterator 차이

Iterator 인터페이스는 컬렉션의 요소에 접근할 때 한 방향으로만 이동 가능

ListIterator 인터페이스는 컬렉션 요소의 대체, 추가, 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원

 

연결 리스트(LinkedList)를 반복자(iterator)를 사용하여 순회하는 예제

 

리스트 반복자(List Iterator)를 사용하여 리스트의 모든 요소를 양방향 즉, 각각 순방향과 역방향으로 출력하는 예제

*while문 대신 for each문(향상된 포문) 많이씀

 

 

메소드

ListIterator 인터페이스 메소드

 

 

 

Enumeration<E> 인터페이스

JDK 1.0부터 사용해 온 Iterator 인터페이스와 같은 동작을 하는 인터페이스

hasMoreElements()와 nextElement() 메소드를 사용하여 Iterator와 같은 작업을 수행

 

현재에는 기존 코드와의 호환성을 위해서만 남아있으므로, Iterator 인터페이스 사용 권장

 

 

출처 : http://www.tcpschool.com/java/java_collectionFramework_iterator

 

 

 

 

 

728x90
반응형
728x90

 

Wrapper class(래퍼 클래스)

기본자료형을 클래스화 시킨 것

기본자료형을 객체화 해주는 클래스

 

기본형 데이터타입을 클래스화하면 Object 클래스의 자식 클래스가 되며,

데이터타입에 상관없이 Object클래스를 이용한 처리가 가능해진다

 

 

Wrapper class 출현 배경

기본 자료형들은 ‘자료형’으로만 사용, 메소드 사용불가. 그래서 래퍼클래스가 나오게됨

 

*기본자료형 8가지

boolean char byte int short long float double

 

Wrapper 래퍼클래스는 참조 자료형

클래스 자체가 자료형으로 사용가능하기에 래퍼클래스도 자료형으로도 사용 가능하고, 그 안에 메소드도 활용가능

 

기본 자료형(primitive)

    - 자료형 사용 o, 메소드 사용x

참조 자료형(non-primitive, reference type)

(Wrapper Class = 참조형)

    - 자료형 사용 o, 메소드 사용 o

 

기본 자료형 Wrapper Class
boolean Boolean
char Character
byte Byte
int Integer
short Short
long Long
float Float
double Double

 

 

boxing vs unBoxing

기본자료형 vs Wrapper클래스

  • boxing : 기본자료형 → wrapper클래스로 변환(객체화)
  • unBoxing : wrapper클래스 → 기본자료형으로 변환
    • 객체에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업

 

Wrapper클래스가 박스

안에 메소드,필드 등 담아두기에 박스

반대로 박스(객체)에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업이 언박싱

// boxing
int num1 = 10;
Integer integer1 = new Integer(**num1**); // num1 자체를 래퍼클래스로 전환 -> boxing

// unBoxing
int num2 = integer1.**intValue();**       // num2 : 래퍼클래스를 기본자료형 int로 변환 -> unBoxing
// boxing
int i = 10;
Integer iValue1 = new Integer(i); 
Integer iValue2 = new Integer(123);

double d = 1.123;
Double dValue1 = new Double(d); 
Double dValue2 = new Double(5.323);
// unBoxing
Integer iValue = new Integer(4578); 
int i = iValue.intValue();

Double dValue = new Double(44.241); 
double d = dValue.doubleValue();

 

 

autoBoxing, autoUnBoxing

JDK1.5버젼부터 지원

자동으로 박싱,언박싱

기본 타입과 Wrapper클래스 타입 간의 변환이 자동으로 이루어진다

(바로 대입적용이 가능케됨)

// 자동박싱,언박싱. 바로 대입적용이 가능케됨
Integer integer2 = num1; // autoBoxing
int num3 = integer2;     // autoUnBoxing
int i = 10; 
Integer iValue = i; // 바로 대입 가능

Double dValue = new Double(3.14); 
double d = dValue;  // 바로 대입 가능

 

 

 

 


 

 

 

1)String을 기본 자료형으로 바꾸기

parsing(파싱)

기본자료형에서 래퍼클래스로 변환하기 위해 많이 사용하는게 파싱(parsing)

parsing : 문자열을 기본 자료형으로 변환하는 것

변환가능한 같은 형태이여야한다

     ex) 숫자면 숫자끼리. 문자열 "1"을 int 1로 변환 가능

int i = Integer.parseInt("10");
double d = Double.parseDouble("홍길동");
// 에러메시지 : java.lang.NumberFormatException: For input string: "홍길동"
// 파싱할 자료형의 형태를 지니지 않아서 나는 에러

short s = Short.parseShort("10 ");		// 잦은 실수 요인 : 공백 조심
float f = Float.parseFloat(" 10");
boolean b = Boolean.parseBoolean("true");
byte by = Byte.parseByte("10");
Long l = Long.parseLong("10");
// 캐릭터 래퍼클래스에는 파싱기능 존재x -> chatAt()로 대체

byte b = Byte.parseByte("1");
short s = Short.parseShort("2");
int i = Integer.parseInt("3");
long l = Long.parseLong("4");
float f = Float.parseFloat("0.1");
double d = Double.parseDouble("0.2"); 
boolean bool = Boolean.parseBoolean("true");

char c = "abc".charAt(0);

 

 

2)primitive type(기본 자료형)을 String으로 바꾸기

String str1 = i + ""; 					   // 방법1. 가장 쉬운 변환.대중적 사용
String str2 = String.valueOf(s); 		   // 방법2
String str3 = Byte.valueOf(by).toString(); // 방법3
String b = Byte.valueOf((byte)1).toString();
String s = Short.valueOf((short)2).toString();
String i = Integer.valueOf(3).toString();
String l = Long.valueOf(4L).toString();
String f = Float.valueOf(0.1f).toString();
String d = Double.valueOf(0.2).toString();
String bool = Boolean.valueOf(true).toString();
String ch = Character.valueOf('a').toString();

 

728x90
반응형
728x90

 

A. StringBuffer 안에 쓸 수 있는 많이 쓰는 메소드

1) append()

받아온 값을 뒤에 추가로 이어주는 메소드

// append()
// 받아온 값을 뒤에 추가로 이어주는 메소드
buffer3.append("abc"); // 결과값 abcabc
System.out.println(buffer3);
System.out.println("buffer3의 실주소값 : " +System.identityHashCode(buffer3)); // append 추가후에도 주소값 같음
																		// ->수정 후에도 buffer가변클래스인걸 알 수 있음

 

*이중 append()

// 2) append() 반환값 : Stringbuffer
buffer3.append("abc").append("def"); // 메소드 체이닝
System.out.println(buffer3); // 결과값 abcabcdef
System.out.println("abc, def 추가 후의 buffer3의 수용량 : " +buffer3.capacity()); 		// 수용량 단위는 character 한문자이므로 기본용량16에 abc 세글자를 +3해서 19
System.out.println("abc, def 추가 후의 buffer3에 들어있는 실제 값의 길이 : " +buffer3.length()+"\\n"); // StringBuffer 생성자에 들어간 문자열 abc 길이3

 

 

2) insert()

원하는 자리에 값 추가 시킬 수 있는 메소드

// 원하는 자리에 값 추가 시킬 수 있는 메소드
buffer3.insert(2,"zzz");
System.out.println("인덱스2에 추가 후의 buffer3 : "+buffer3+"\\n"); // abzzzcabcdef

 

 

3) delete()

데이터 삭제하는 메소드

delete(int start, int end) : StringBuffer deleteCharAt(int index) : StringBuffer

// 데이터 삭제하는 메소드
// delete(int start, int end) : StringBuffer	
// deleteCharAt(int index) : StringBuffer	

buffer3.delete(2, 5);							 // zzz 삭제. 마지막 인덱스 미포함. 
System.out.println("삭제 후의 buffer3 : "+buffer3); // delete(2, 5-1) // (start, end-1)
buffer3.deleteCharAt(2);
System.out.println("삭제 후의 buffer3 : "+buffer3+"\\n"); //

 

 

4)reverse()

앞뒤 거꾸로 값을 바꿔놓는 메소드

buffer3.reverse();							 // zzz 삭제. 마지막 인덱스 미포함. 
System.out.println("reverse의 buffer3 : "+buffer3); // 

StringBuilder sb = new StringBuilder("abc"); 
sb.append("zzz").insert(2,"yy").reverse().delete(1,3);
// abc + zzz -> abyyczzz -> zzzcyyba -> zcyyba

 

 


 

 

B. String 안에 쓸 수 있는 많이 쓰는 메소드

 

1)charAt ()

charAt (int index):char 해당 문자열의 index번째 문자를 char로 변환

 

2)concat()

concat(String str):String String concatStr = str.concat("!!!"); System.out.println("concatStr : "+concatStr)

concat(String str):String 원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환

String concatStr = str.concat("!!!");
System.out.println("concatStr : "+concatStr);
str += "!!!"; // concat과 같은 역할 : +
System.out.println(str);

 

3)equals()

equals(Object anObject):boolean

문자열이 같은지 확인

System.out.println("concatStr.equals(str) : "+concatStr.equals(str));
// 결과값 : concatStr.equals(str) : true

 

4)substring()

substring(int beginIndex):String

해당 인덱스 넘버부터 문자열 시작

substring(int beginIndex, int endIndex):String

A to B 사이의 문자열 일부 반환

System.out.println("str.substring(6) : "+str.substring(6));
// 결과값 : str.substring(6) : world!!!

str.substring(0,4) : Hell
// 결과값 : str.substring(0,4) : Hell

 

5)replace()

replace(char oldChar, char newChar):String

기존 문자를 새로운 문자로 대체하여 반환

System.out.println("str.replace('l','e') : "+str.replace('l', 'e'));
// 결과값 : str.replace('l','e') : Heeeo wored!!!

 

6)toUpperCase() & toLowerCase()

toUpperCase():String toLowerCase():String

문자열을 대/소문자로 변형 후 반환

System.out.println("str.toUpperCase() : "+str.toUpperCase());
System.out.println("str.toLowerCase() : "+str.toLowerCase());
// 결과값 : str.toUpperCase() : HELLO WORLD!!!
// 결과값 : str.toLowerCase() : hello world!!!

 

7)equalsIgnoreCase()

equalsIgnoreCase(String anotherString):boolean 대문자는 무시하고 비교

String str2 = "Wonderful";
String str3 = "wonderful";
System.out.println(str2.equals(str3));			    // 결과값 : false
System.out.println(str2.equalsIgnoreCase(str3));// 결과값 : true

 

8)trim()

trim():String

앞 뒤에 있는 빈 공간을 제거한 문자열 반환

String str4 = "    Java";
String str5 = "  Java  ";
String str6 = "Java    ";	
System.out.println(str4+" : "+str4.trim());
System.out.println(str5+" : "+str5.trim());
System.out.println(str6+" : "+str6.trim());
// 결과값
/*
Java : Java
Java   : Java
Java     : Java
*./

 

9)split()

split(String str):String[]

전달받은 구분자를 통해 문자열을 잘라 String[]반환

String splitStr = "Java, Oracle, JDBC, Front, Server, Framework";
String[] strArr = splitStr.split(", "); // 공백도 나누는 기준인걸 잊지마
for(int i=0; i < strArr.length; i++) {
	System.out.println(strArr[i]); //
/* 결과값
Java
Oracle
JDBC
Front
Server
Framework
*/

 

 

 

728x90
반응형
728x90

 

자바 기본 API(Application Programming Interface)

목차

1.String

2.Wrapper

3.Date

  1. Calendar
  2. Gregorian Calendar

4.Math

 


 

String Class

String : 문자열 클래스

문자열의 값 수정 불가(불변 클래스) 수정 시 수정된 문자열이 새로 할당 되어 새 주소를 넘김

String name = "abc";
name = "def"; // <-수정된 거 아닌가? 수정된거 아님
immutable(불변) 의미
배열 크기 변경 불가능처럼
눈으로 보이기는 수정되는 것처럼 보이나 컴퓨터 안에 로직은 삭제 새로생성되었고 주소값도 변경됨

 

 

API에 구현이 되어있는 메소드들

hashCode(), identityHashCode()

 

hashCode()

hashCode() : int ← 매개변수x 주소값 반환

Returns a hash code for this string.

주소값을 보기 위해 사용하는 코드

객체의 주소값을 해시코드로 구현한 결과값

object클래스에 있음.

실제 주소값을 직접 볼 수 있는건 아님.

자바는 애초에 주소값을 다이렉트로 볼 수 없게 만듬

equals비교했는데 둘이 같다면 해쉬코드 결과도 둘이 같게해줘야한다

System.out.println("str1의 hashcode : "+str1.hashCode());
System.out.println("str2의 hashcode : "+str2.hashCode());
System.out.println("str3의 hashcode : "+str3.hashCode());

 

identityHashCode()

System.identityHashCode(변수명)

실주소값을 연산해놓은 결과값을 도출하는 메소드

스트링은 불변 클래스

수정되는게 아닌 새로 생성하고 기존것 삭제하고 대체되는 개념

 


 

StringBuffer & StringBuilder

문자열 클래스

주소값은 그대로하고 문자열을 수정 가능케 하는 메소드

가변클래스 : 문자열 수정 가능. mutable(가변)

    - String클래스 : 변경이 적고 읽기만 많은 경우에 유리

    - StringBuffer / StringBuilder : 문자열에 대한 수정이 많이 일어나는 경우 유리

https://rise-up.tistory.com/303

 

[Java] 주소값은 그대로하고 문자열을 수정 가능케 하는 메소드 : StringBuffer & StringBuilder

StringBuffer & StringBuilder 클래스는 불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변 클래스다 String이 수정이 불가능하다니 무슨 말일까? String 타입의 변수에 값을 넣어보면 언제든

rise-up.tistory.com

 

 

StringBuffer vs StringBuilder 비교

불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변(mutable)클래스

문자열 값 수정 가능, mutable(가변) 수정, 삭제 등이 기존 문자열에 수정되어 적용 기본 16문자 크기로 지정된 버퍼를 이용하며 크기 증가 가능

모두 같은 기능이나 동기화처리 가능 / 불가능으로 구별된다

동기화가 들어가면 안전 : 데이터에 대해 락을 걸어놓고 진행. 처리속도가 느림. 동기화가 안들어가면 속도가 빠름

  • StringBuffer   동기화 o / 느림 / 안전 / thread safe기능o
  • StringBuilder 동기화 x / 빠름 / 안전 x / thread safe기능x

 

메모리 관리를 위해 String대신 쓰기도 하나 String을 대개 많이씀

컴퓨터도 많이 좋아지고 버퍼나빌더를 쓴다고 눈에띄게 빨라지는건 아님

StringBuffer/StringBuilder는 자동으로 수용량 증가

 

 

쓰레드 세이프 기능(thread safe)

멀티 쓰레드 프로그래밍에서 여러 쓰레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 의미

이를 위해 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 "임계 영역(critical section)"과 "잠금(lock)"의 개념이 도입됨

 

  • 임계영역(critical section)

둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 리소스(자료 구조 또는 장치)를 접근하는 코드의 일부를 뜻함

  • 락(lock)

모든 객체에는 락(lock)이 하나씩 있고 이 락(lock)을 가지고 있는 스레드만 해당 객체의 임계 영역 코드와 관련된 작업이 가능

  1. 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정하고, 공유 데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 영역 내의 코드를 수행할 수 있게함
  2. 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나 lock을 반납해야만 다른 쓰레드가 반납된 lock을 획득하여 임계 영역 내의 코드를 수행할 수 있도록함

 

 

쓰레드(thread)의 동기화(Synchronization)

여러 스레드가 한 리소스를 사용하려 할 때

사용하려는 스레드 하나를 제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것

 

쓰레드 동기화는 크게 Synchronized, Volatile, Atomic 3가지가 있고 추후 깊게 공부해보자

 

728x90
반응형
728x90

 

▶ 추상클래스(abstract)

몸체(=중괄호 ) 없는 메소드

중괄호{ } 없는 메소드

미완성된 클래스를 뜻함

선언되어 있지만 구현되지 않은 미완성의 메소드(추상 메소드)를 포함하고 있는 클래스일 때 반드시 abstract 키워드를 class 앞에 붙여 준다.

클래스 앞에 ‘abstract’ 키워드를 붙이면 추상 클래스가 생성되며, 객체를 생성할 수 없다는 점만 빼면 일반 클래 스와 다른 점이 없다

 

1.미완성 클래스

자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성

  1. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스 abstract 메소드가 없어도

abstract 클래스 선언 가능 3. 클래스 내에 일반 변수, 메소드 포함 가능 4. 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능

클래스로서의 객체 생성은 못 하지만, 새로운 클래스를 작성할 때 부모 클래스로 이용되며 새 클래스 작성을 위한 템플릿이 되어 상속 받은 클래스들의 규칙을 주는 용도로 사용 가능

abstract

추상, 추상개념, 추상의, 추상적인

abstract 붙은 클래스는 ‘추상클래스’라고 부름

abstract : 예약어

 

 

 

추상메소드

중괄호 없이 바로 세미콜론 ;

일반 메소드 : [접근제한자] [예약어] 반환형 메소드명( [매개변수] ) **{  }**

추상 메소드 : [접근제한자] abstract 반환형 메소드명( [매개변수] )  ;  

 

 

추상메소드를 왜 만들까?

나를 상속한 얘가 반드시 나를 만들 수 있도록(오버라이딩) 강제하기 위해서 만듬

상속 시, 반드시 오버라이딩 할 수 있도록 강제화

공통적 규약을 만들기 위해 쓰인다

 

오버라이딩 강제 why?

전화기면 모든 전화기는 전화통화는 가능해야하니 전화기능을 공통적으로 가져야만 한다

안에서 꼭 필요한 기능이 있으면 강제적으로 그 기능을 가지게 하므로 규약을 만드는 것

미완성 메소드

=추상메소드

미완성이라 static과 사용 불가

몸체(=중괄호)가 없다보니 미완성메소드

반드시 오버라이딩시키는 이유도 미완성이라 완성 시킬려고 하는 것

내 몸체 안에 추상클래스(=미완성클래스, 중괄호x)가 있을수 있다

추상클래스 자체를 객체로 만들어 사용할 수 있을까?

no

 

특징

1)자체적으로 객체생성 불가

객체생성은 안되나 참조변수로 활용은 가능

상속을 시켜서 객체를 만드는 건 가능

2)추상 메소드가 없어도 추상클래스 선언 가능

추상클래스는 꼭 추상메소드를 포함하고 있어야한다? no

3)추상 클래스 내에 일반 변수나 메소드 포함가능

 

유의사항

1)클래스에 abstract와 final 동시 사용 불가

abstract는 상속(extends)해야만 하고

final은 클래스에서 상속이 안된다는 것

둘이 완전 정반대

2)메소드에 abstract와 static 동시 사용 불가

abstract는 미완성 메소드인데 미완성 메소드를 static공유한다는건데

미완성 공유는 말이 안됨

3)abstract 메소드의 접근제한자로 private 불가능

미완성 메소드라 오버라이딩 해야되는데 private이면 오버라이딩 자체가 불가능하기에 논리가 안맞음

 

*추상 클래스의 상수는 static 선언이 필요

 

 


 

 

▶ 인터페이스(Interface)

상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체

메소드 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것

상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함

공통적 규약을 만들기 위해 쓰이며, abstract보다 더 강력한 규약을 만들기 위해 사용함

abstract < Interface

*왜 그렇게 말할까?

추상 메소드만 작성할 수 있음

 

사용법

[접근제한자] interface 인터페이스명 { }

이 안에는 상수형 필드와 추상 메소드만 들어갈 수 있다

상수형 필드 : [public static final]

추상 메소드 : [public abstract]

[접근제한자] interface 인터페이스명 {
		// 상수도 멤버로 포함할 수 있음
		public static final 자료형 변수명 = 초기값; // 추상 메소드만 선언 가능

		[public abstract] 반환자료형 메소드명([자료형 매개변수]); // public abstract가 생략되기 때문에
		// 오버라이딩 시 반드시 public 표기해야 함
}

 

 

인터페이스 앞 수식어들을 생략할 수 있는 이유

어차피 들어갈 수 있는 수식어들이 한정되어 있고

없으면 어차피 인터페이스 자체가 존재 불가능이기 때문

 

 

특징

1)모든 인터페이스의 메소드는

상수형 필드와 추상메소드만 들어갈 수 있기 때문에 묵시적으로public static final, public abstract

2)변수는 묵시적으로 public static final,

따라서 인터페이스 변수의 값 변경 시도 시 컴파일 시 에러 발생

3)인터페이스 자체로 객체 생성 x

상속(implements)으로 객체생성 o (abstract의 상속은 extends)

참조변수로 사용 o

728x90
반응형
728x90

 

다형성(Polymorphism)

다양한 형태를 지니고 있다고 해서 다형성

부모타입 레퍼런스로 자식 타입 객체를 받아올 수 있는 것

부모타입 레퍼런스에 자식 타입 객체를 담을 수 있는 것

// 기존
Animal a = new Animal(); // o
Dog d = new Dog();       // o
Snake s = new Snake() ;  // o

// 다형성
Animal a1 = new Dog();   // o
Animal a2 = new Snake(); // o  이를 업캐스팅(Upcasting)이라고 함

상속을 전제로,

부모 타입으로 만들어진 자식 객체를 부모 클래스 타입으로 다룰 수 있는(담을 수 있는) 기능

자식을 부모에게 담는 것

자식 객체를 부모타입에 담는 것을 다형성

 

Class의 형변환 (Upcasting, Downcasting)

형변환은 클래스 사이에서 일어나는데 자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로 형변환이 가능

1)upcasting

upcasting은 서브타입의 인스턴스를 수퍼타입의 변수로 접근하는 것을 말합니다.

즉, 자식 클래스가 부모 클래스 타입으로 캐스팅 되는것을 뜻합니다.

이때 서브 타입에서는 수퍼타입에 선언된 필드 혹은 메서드만 접근 가능합니다.

 

2) down casting

downcasting은 서브타입 인스턴스를 참조하는 수퍼타입 변수를 재참조하는 것을 말합니다.

즉, 부모 클래스가 자식클래스 타입으로 캐스팅되는 것을 뜻합니다.

이때 강제형변환이 일어나며, 다운캐스팅한 타입에서 선언된 모든 필드와 메서드에 접근이 가능합니다.

출처 : https://viera.tistory.com/3

 

업캐스팅 : 부모타입 자식객체

다운 캐스팅 : 부모타입 참조변수를 자식 클래스 타입으로 형변환

→ 자식객체의 멤버에 접근(참조)가능

 

 

1. 부모 타입 레퍼런스로 부모 객체를 다룰 때

2. 자식 타입 레퍼런스로 자식 객체를 다룰 때

3. 부모 타입 레퍼런스로 자식 객체를 다룰 때

4. 자식 타입 레퍼런스로 부모 객체를 다룰 때

 

자식 타입 레퍼런스로 부모 객체를 다룰 때 : 에러 이유

4번 자식 타입 레퍼런스로 부모 객체를 다룰 때, 에러 이유

에러 이유 : 확장된 Child2가 Parent 더 기능이 많은데, 기능이 적은 Parent가 확장된 Child2의 부분을 맞춰줄 수 없기 때문

즉, 없는 값까지 불러와야 하니 에러

 

 

객체배열에서의 다형성

객체타입이 다른 4개의 배열을 하나에 담을 수 없지만 객체배열 다형성 덕에 가능해짐

 

instanceof

객체 자체비교하기 위한 연산자

레퍼런스 변수가 해당 타입의 객체를 참조하고 있는지 확인할 때 사용

true / false

ex) 레퍼런스 A instanceof 클래스타입 B

= a가 b타입의 객체를 참조하니?

A instanceof B : A가 B타입의 객체를 참조하니? 라고 물어보는 것

A(레퍼런스) instanceof B(클래스타입) :  A가 B타입의 객체를 참조하는가

instance, 객체라는 뜻

of, ~의라는 뜻

 


 

동적 바인딩 & 정적 바인딩

바인딩 : 묶여있는 것

프로그램이 실행할 때 모든 코드들은 다 바인딩이 되어있다(묶여있다)

이 메소드를 진짜로 실행한 메소드를

코드로써 실제로 실행할 메소드까지 연결시켜주는걸 바인딩한다고 함

모든 코드들은 정적 바인딩이 되어있음

 

1.정적 바인딩

정적 바인딩이란?

코드만 보고 바인딩 시키는 것

컴파일 할 때 연결되서 바인딩되는 것

정적 바인딩

. 은 ~안에 뜻

pArr[i].print(); // 패런트타입 pArr[i] 안에 print()메소드 ( pArr[i] > print() )

패런트에 있는 프린트해와야겠다

 

2.동적바인딩

내가 막 실행할려고 컴파일,오류검사등 다 마치고 막 실행할려고 할 때 그 실행할 객체를 기준으로 해서 바인딩이 바뀌는 것

윗줄 예시로 보면 pArr[i] 안에 객체가 패런트가 아니고 윗줄

기준이 실행할 객체 타입으로 다시 바인딩이 바뀜=동적바인딩

동적 바인딩 적용 조건

다형성과 오버라이딩이 적용되어있다는 전제

728x90
반응형
728x90

 

 

오버라이딩(Overriding)

자식이 부모한테 상속받은 메소드를 재작성하는 것

부모 클래스가 가진 기능을 자식 클래스가 재정의(추가,수정 등)하는 것

    *부모클래스를 자식클래스가 호출하는 개념

 

조건

  1. 부모 메소드 이름과 같아야한다
  2. 매개변수 전부 동일
  3. 반환타입 동일  ↔ 오버로딩은 반환타입 영향x 매개변수만 영향
  4. 부모 메소드가 private이면, 그 메소드는 오버라이딩 불가
  5. final 메소드 오버라이딩 불가

*final 종단 의미. 변경 불가, 여기까지 끝

변수 외에도 메소드,클래스에도 가능(예약어)

 

 

상속불가 조건

부모가 final,private면 상속불가

[접근제한자] [예약어] 반환형 메소드명 ( [매개변수] ) {}

  상속불가 조건                     선언부라고 부름

                           (선언부가 부모자식 동일해야함)

 

상속불가 조건 선언부라고 부름

 

 

@Override 

오버라이드 어노테이션

오버라이딩 했다는 표시 : 어노테이션(Annotation, 주석)

첫글자 대문자 아니면 빨간줄 에러남

@Override 붙이고 메소드명 변경하면 빨간줄 에러 발생

오버라이딩이 잘되고 있는지 검사해서 알려주는 것이 @Override

 

 


 

 

오버로딩(overloading)

한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것

 

조건

같은 메소드 이름 다른 매개변수 선언부(매개변수 타입, 개수, 순서)

메소드의 리턴타입은 오버로딩 조건과 관계 없음

 

 

 

상속에서 오버라이딩한 예

 

toString 작성하는 것도 오버라이딩 한 것

@Override
public String toString() {
	return "Sub [x=" + x + ", y=" + y + ", a=" + a + "]";
}

 

 

728x90
반응형
728x90

 

상속(Inheritance)

부모 클래스가 가지고 있는 멤버(필드or메소드)를 자식 클래스에게 넘겨주는 것

자식은 부모를 확장한 것

다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써, 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능

 

명령어 : extends

[접근제한자] class 클래스명 extends 클래스명{}

 

 

상속 명칭

부모클래스 = 조상클래스 = 상위클래스(super class)

자식클래스 = 자손클래스 = 하위클래스(sub class)

 

 

상속 목적

1.클래스의 재사용 가능

2.공통적인 규약 정의

 

 

상속 장점

1.코드량 감소

직접 만들지않고 부모클래스를 가져다 쓰기 때문

적은 양의 코드로 클래스 작성 가능

 

2.코드 추가,삭제,변경 용이

부모클래스의 데이터가 공통분모가 되서 일괄변환됨

코드를 공통적으로 관리하기 때문에 코드 추가/변경 용이

 

3.중복 제거 → 생산성,유지보수up

 

 

상속 특징

1.모든 클래스는 Object클래스의 후손(=Object는 최상위 클래스)

    Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능

         ex) java.lang.String 클래스의 equals()와 toString()

부모클래스로부터 멤버(필드,메소드) 받아오는 것

 

2.부모 클래스의 생성자, 초기화 블록은 상속 안됨

자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행

자식 클래스 생성자 안에 부모 클래스 생성자를 호출하고 싶으면 super() 활용

    - 부모클래스에 접근하는 방법 : super()

 

3.부모의 private멤버는 상속은 되지만 직접 접근 불가

자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가

(private 접근 범위, 해당 클래스 안이기에 직접적으로는 접근 불가)

 

접근 하는 방법

  1. super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨 생성
  2. setter, getter 메소드를 이용하여 접근

 

*부모클래스와 자식클래스의 주소값은 다르다

(=참조하고 있지 않다는 의미. 주소값이 다르기에 )

부모클래스의 객체 주소값은 고정되어있지 않다

자식 클래스라고 해서 부모클래스가 그대로 들어가지 않는다

 

 

자바의 단일상속, 다중 상속

※ 다중 상속

C++에서 사용 가능한 기능

여러 클래스로부터 상속이 가능하며 복합적인 기능을 가진 클래스를 쉽게 생성 가능

    - 서로 다른 클래스로부터 상속받은 멤버 간의 이름이 같은 경우 문제 발생

 

자바에서 다중상속 불가

단일 상속만 가능. 만약 다중상속이 필요하면 단일 상속을 여러번 사용해서 구현 가능

하나의 자식에 여러 부모 불가

하나의 부모에 여러 자식 가능

화살표 : 아래에서 위로

자식이 부모를 가리키는 것

고로, 자식 클래스에서 부모클래스를 화살표가 가리켜야 한다

상속에서 쓰이는 화살표는 머리가 빈 화살표시

 

 

상속 시 딱 하나만 상속 받아오는 것

자바에서는 다중상속하지 않고 단일 상속을 지원함

why?

어느 클래스에서 받아왔는지 알기가 어려워지기 때문 단일 상속만 지원

클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성가능

 

자바에서 다중상속이 필요한 경우,

단일 상속을 여러번해서 다중상속을 표현할 수 있다

 

 

※ 해당 필드나 getter,setter가 어느 클래스에 속한지 알아볼 때 유용한 팁

대쉬 안에 있는건 어디 안에 있는 메소드인지 보여주는것

 

 

상속의 예시

Object에 있는 메소드들

어떻게 들어가 있을 수 있을까?

모든클래스는 object클래스 후손이기 때문

내가 만든 클래스(사용자 정의 클래스)도 object의 후손이기 때문에 object 안에 있는 클래스들을 다 상속 받은거고 사용할 수 있는 것

.

java.lang.Object

모든 클래스의 부모클래스

최상위 클래스라고 부른다

 

 

728x90
반응형

+ Recent posts