본문 바로가기

Java/JAVA

(45)
상속 (2) Object 슈퍼클래스 자바에서 모든 클래스는 Object클래스를 직/간접적으로 확장한다. 클래스에 명시적인 슈퍼클래스가 없으면 암시적으로 Object클래스를 확장한다.Object클래스는 모든 자바 객체에 적용할 수 있는 메서드를 정의한다.이 중 몇가지를 살펴본다.toString 객체의 문자열 표현을 돌려준다.x.toString() 대신에 "" + x 로 작성할 수도 있다. 이 표현식은 x가 null이거나 기본 타입 값일 때도 제대로 동작한다.배열 출력Arrays.toString(배열참조변수이름)equals 객체가 같은지 검사하는 메서드두 객체가 같은 내용을 담고 있을 때 같다고 보는 상태기반 동등성 검사가 필요한 경우에만 equals 메서드를 오버라이드 한다.인스턴스 변수가 배열이면 정적메서드 Arra..
상속 (1) 슈퍼클래스와 서브클래스 Employee 클래스의 몇 가지 기능을 보유하면서 관리자가 직원과 어떻게 다른지 명시하는 클래스 작성public class Manager extends Employee{추가된 필드추가된 메서드 또는 오버라이딩 메서드}* 슈퍼클래스는 부모 클래스고 서브클래스는 부모클래스의 기능을 상속받는 자식클래스다.* 단, 슈퍼클래스라고 더 우월하지 않다는 점이다. 오히려 서브클래스가 슈퍼클래스보다 많은 기능이 있다.메서드 오버라이딩 public class Manager extends Employee{...public double getSalary(){ // 슈퍼클래스의 메서드를 오버라이드한다.return super.getSalary() + bonus;}}* super는 this와 달리 객체에 ..
람다표현식 (2) 람다표현식 처리 람다를 사용하는 핵심 목적은 지연 실행이다.어떤 코드를 당장 사용하고 싶으면 람다를 사용할 필요가 없다.* 별도의 스레드에서 코드 실행* 코드를 여러번 실행* 알고리즘의 올바른 지점에서 코드 실행* 어떤 일이 일어날 때 코드 실행* 필요할때만 코드 실행람다를 받으려면 함수형 인터페이스를 선택or구현 해야한다.public static void repeat(int n, Runnable action){for(int i=0;i
람다표현식 (1) 람다표현식 한번이든 여러번이든 나중에 실행할 수 있게 전달하는 코드 블록.문법 : (String first , String second) -> first.length() - second.length()(String first , String second) ->{int difference = first.length() 0) return 1;else return 0;}여러 줄로 작성할 떄는 메서드를 작성하는 것처럼 작성한다.람다 표현식이 파라미터를 받지 않으면 파라미터가 없는 메서드처럼 빈 괄호를 붙임Runnable task = () -> {for (int i=0;i first.length..
인터페이스 (2) 인터페이스 기본메서드인터페이스 메서드 중 어느 것이든 기본 구현을 작성할 수 있다. (추상클래스는 안됨)인터페이스 메서드 충돌 public interface Person{default int getId(){return 0;}}public interface Identified{default int getId(){return Math.abs(hashCode());}}이렇게 두개의 인터페이스가 있을 때 하나의 클래스에서 두 인터페이스를 상속받으면 어떻게 해야할까?방법은 고유의 getId()를 클래스에서 새로 작성하거나, 명시하는 방법이다.public class Employee implements Person , Identified{public int getId() {return Identified.super...
인터페이스 (1) 인터페이스 서비스 공급자와 자신의 객체가 해당 서비스를 사용할 수 있게 하려는 클래스가 있을 때, 이 두 클래스 사이의 계약을 표현하는 매커니즘* 인터페이스의 모든 메서드는 자동으로 public이 된다.타입변환 상위 인터페이스 타입의 변수는 하위 인터페이스에서 상위인터페이스를 구현한 어떤 클래스의 객체라도 참조할 수 있다.가끔 역으로 슈퍼타입에서 서브타입으로 하는 것도 필요하다. 이럴 때는 변환을 해야한다.IntSequence sequence = ......;DigitSequence digits = (DigitSequence) sequence;System.out.println(digits.rest());여기서 rest()는 IntSequence의 메서드가 아니라 DigitSequence의 메서드다. 따라..
자바 패키지 패키지를 쓰는 이유 패키지는 주로 클래스 이름의 유일성을 보장하려고 사용한다. 서로 다른 패키지에 같은 이름의 클래스를 넣어도 충돌이 일어나지 않는다.*자바에서는 패키지는 중첩되지 않는다 java.util과 java.util.regex 패키지는 서로 관련이 없다.클래스 임포트하기 import 문이 있으면 전체 이름 없이도 클래스를 사용할 수 있다.import java.util.Random; 그러면 코드에서 java.util.Random을 Random으로 사용할 수 있다.*여러 패키지를 임포트하다 보면 클래스가 충돌이 일어날 수 있다.예를들면import java.util.*;import java.sql.*;두 패키지의 클래스들을 임포트하면 둘다 Date클래스가 있기때문에 충돌을 일으킨다. (컴파일오류)이럴..
정적 변수와 정적메서드 정적변수 클래스 안에 있는 변수를 static으로 선언하면 해당 변수는 클래스당 "하나"만 있게 된다.사실 더 적절한 용어는 '클래스 변수' 라고 할 수 있다.정적상수 변경 가능한 정적 변수는 드물지만, 정적 상수는 아주 일반적이다.public static final double PI = 3.14159265358979323846;정적메서드 public class Math{public static double pow(double base , double exponent){...}}Math클래스의 pow메서드는 정적 메서드다. 왜 인스턴스 메서드로 만들지 않았을까?자바에서 기본 타입(8가지)은 클래스가 아니므로 double의 인스턴스 메서드가 될 수 없다.정적메서드를 사용하는 또 다른 이유는 다른 사람이 만..