본문 바로가기

자바45

[JAVA] 상속 - 추상 클래스와 인터페이스 상속을 적용하면 코드를 재사용하고 다형성, 오버라이딩 메소드 등을 이용하여 재사용성 및 유지보수를 향상시킬 수 있습니다. 하지만 상속은 강제성이 없습니다. 하위 클래스에서 상위 클래스의 메소드를 상속받아 사용하지 않고 자신만의 메소드를 사용하게 되면 상속의 장점을 얻을 수 없게 됩니다. 이 때문에 상위 클래스의 메소드를 반드시 사용하게끔 강제할 필요성이 생기는데, 추상 클래스와 인터페이스를 사용하면 상위 클래스의 메소드를 반드시 사용하도록 강제할 수 있어 재사용성 및 유지보수를 더욱 향상시킬 수 있게 됩니다. ◆ 추상 클래스 (abstract class) 클래스가 설계도라면, 추상 클래스는 미완성 설계도라고 할 수 있습니다. 블록({ }) 이 없는 추상 함수(abstract method)를 포함할 수 있.. 2022. 5. 28.
[JAVA] 상속 - 메소드 오버라이딩, 다형성 ◆ 메소드 오버라이딩 (method overriding) 일반적으로 상속 관계에서 부모 클래스의 메소드를 자식 클래스에서 조건 없이 사용 가능합니다. 그런데 자식 클래스에서 부모 클래스의 메소드를 재정의해서 사용할 수도 있는데, 이를 메소드 오버라이딩(method overriding)이라고 합니다. 메소드 오버로딩(method overloading : 이름은 같으나 매개변수가 다른 함수를 여러번 정의)과는 다른 개념입니다. 메소드 오버라이딩을 사용하기 위해서 우선 상속이 전제되어야 합니다. 그리고 부모 클래스에서 선언된 형식 그대로 자식 클래스에서 선언되어야 합니다. 즉, 메소드 이름, 리턴타입, 매개변수, 접근지정자 등이 동일해야 합니다. (더 작은 타입의 리턴타입과 더 넓은 범위의 접근지정자로 재정의.. 2022. 5. 27.
[JAVA] 상속 (Inheritance) 부모가 자식에게 물려주듯, 객체들 간 관계에서 부모 클래스(상위 클래스)가 자식 클래스(하위 클래스)에 클래스의 멤버를 물려주는 관계가 있는데, 이를 상속(Inheritance)이라고 합니다. 다음과 같은 형식으로 상속을 표현합니다. public class 자식클래스 extends 부모클래스 { } 상속이 적용되기 위해서는 객체들 간 is a 관계가 성립해야 합니다. 또한, 자바는 단일 상속만 지원하므로 extends 뒤에 부모클래스는 한 개만 올 수 있습니다. 이렇게 상속 관계를 표현해 주면 부모 클래스의 멤버(인스턴스 변수, 메소드)를 자식 클래스가 선언 없이 사용할 수 있게 됩니다. 가장 상위에 있는 최상위 클래스는 Object 클래스입니다. 모든 클래스는 Object 클래스를 묵시적으로 상속받습니.. 2022. 5. 26.
[JAVA] 클래스들의 관계 - has a 관계, is a 관계 ◆ has a 관계 한 객체와 다른 객체가 포함관계인 경우 has a 관계에 있다고 할 수 있습니다. 하나의 클래스 안에 다른 클래스가 인스턴스 변수로 선언된 경우입니다. 예를 들어 자동차 객체는 엔진 객체, 바퀴 객체와 같은 객체들로 구성되어 있습니다. 자동차 has a 엔진, 자동차 has a 바퀴 자동차 클래스 안에 엔진 클래스가 포함되어 있는 경우를 표현해 보겠습니다. public class Engine { String sn; //시리얼넘버 String year; //생산연도 public Engine() {} public Engine(String sn, String year) { super(); this.sn = sn; this.year = year; } public String getSn() {.. 2022. 5. 26.
[JAVA] 싱글톤 디자인 패턴 (Singleton Design Pattern) 싱글톤 디자인 패턴(Singleton Design Pattern)은 단 하나의 인스턴스만 생성하고자 할 때 사용하는 디자인 패턴입니다. 예를 들어 은행에서 계좌를 관리하는 프로그램을 만든다고 생각해 봅니다. 이때 계좌는 사용자마다 각각 존재해야 하지만, 이 계좌들을 관리하는 은행 객체는 단 하나만 있으면 됩니다. 이때 은행 객체를 단 하나만 생성하도록 제약을 걸 때 사용할 수 있는 것이 싱글톤 디자인 패턴입니다. 싱글톤 디자인 패턴을 적용하는 방법은 다음과 같습니다. (1) private 생성자 외부에서 객체를 생성하지 못하도록 생성자의 접근제한자를 private으로 지정합니다. private 접근제한자는 같은 클래스에서만 접근을 허용합니다. (2) static 키워드 이용, 객체 생성 단 하나의 객체는.. 2022. 5. 25.
[JAVA] 객체와 클래스 - static 키워드 static 키워드는 클래스, 변수, 메소드의 지정자로 사용할 수 있습니다. 지금까지 main 함수를 만들 때 항상 보았던 static 키워드입니다. 자바 프로그램은 일반적으로 다음과 같은 과정을 거쳐서 결과값이 출력됩니다. 클래스가 로딩될 때 static 키워드를 사용한 static 변수와 메소드가 메모리에 자동으로 로딩됩니다. 이렇게 미리 만들어진 여러 static 메소드들 중에서 시작점 기능을 하는 main 메소드가 실행된 후, 필요에 따라 객체를 생성하여 인스턴스 변수와 메소드를 메모리에 로딩하고, 메소드를 호출하면 메소드 안에서 선언된 로컬변수가 생성됩니다. static 변수와 메소드는 프로그램이 실행될 때 단 한 번 생성되고 프로그램이 종료될 때 삭제됩니다. 프로그램이 실행될 때 자동으로 로딩.. 2022. 5. 25.
[JAVA] call by value 와 call by reference 메소드를 호출해서 특정 인자를 전달할 때 자바는 call by value 방식으로 전달됩니다. 즉, 값 복사를 통해서 인자가 전달됩니다. 그런데 이때 기본형 데이터인 경우와 참조형 데이터인 경우 각각 인자로 전달되는 값이 달라집니다. ◆ 기본형 데이터 - call by value 값에 의한 호출 기본형 데이터는 call by value 방식으로 값이 전달됩니다. 즉, 메소드를 호출해서 특정 값을 전달할 때 변수에 저장된 실제 데이터 값을 복사하여 전달합니다. 다음의 예시를 살펴보겠습니다. public class Test { private static void change(int x) {//xxx변수 값을 x(매개변수)가 받음 System.out.println("in change 함수 x= "+ x); x.. 2022. 5. 24.
[JAVA] 객체와 클래스 - 객체를 배열로 관리하기 학생을 모델링하여 만든 학생 클래스로 여러 학생 객체를 생성하고 정보를 저장할 수 있습니다. 그런데 이렇게 생성된 학생 객체를 다음과 같이 각각의 변수에 저장하면 관리하기도 어렵고 데이터를 조회하는 것도 번거로워집니다. Student stu1 = new Student("홍길동1", 10, "서울1"); Student stu2 = new Student("홍길동2", 10, "서울2"); ... 그래서 필요한 것이 배열입니다. 객체를 배열로 관리하면 다량의 데이터를 효율적으로 관리할 수 있게 됩니다. 기본형 데이터를 배열로 관리하는 것에 비해 처음 이해가 어려울 수 있지만, 매우 중요한 개념이므로 잘 정리해 놓는 것이 좋습니다. 학생 클래스를 만들고 이를 이용해 학생 객체를 생성한 후 배열로 저장하는 프로그.. 2022. 5. 23.
[JAVA] 객체와 클래스 - 정보 은닉화, 캡슐화(encapsulation) 정보 은닉화, 캡슐화(encapsulation)를 통해 데이터를 보호하고 은닉할 수 있습니다. 예를 들어 학생의 정보를 저장하는데, 나이를 150살 이상으로 입력할 수 없도록 하고자 합니다. ◆ 잘못된 해결 방법 우선 생성자에 나이가 150살 미만일 때만 값이 저장되도록 조건문을 작성하는 방법을 생각해 볼 수 있습니다. public class Student { String name; int age; String address; String ssn; public Student(String name, int age, String address, String ssn) { if(age 2022. 5. 22.
[JAVA] 객체와 클래스 - 메소드(method) 메소드(method)는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것입니다. 클래스의 구성요소 중 하나로서, 클래스의 기능적인 면을 표현할 때 사용합니다. 일반적으로 멤버변수에 저장된 데이터를 수정, 조회, 삭제하거나 중복코드를 처리할 때 사용합니다. 다음과 같은 형식으로 메소드를 정의합니다. [접근제한자] 리턴타입 메소드명([파라미터,...]) { //메소드가 처리하는 실행문 [return 리턴값;] } 메소드를 사용하려면 반드시 해당 메소드가 속한 클래스 객체를 생성한 후 메소드를 호출해야 합니다. 메소드를 호출하면 프로그램 제어가 호출한 곳(caller)에서 호출된 곳(callee, worker)으로 넘어가며, 호출된 곳에서 작업이 끝나면 다시 호출한 곳으로 복귀합니다. 리턴값을 가지고 복귀.. 2022. 5. 22.