[ITWILL : JAVA]기본클래스 이외에 자바 구성요소2 : enum

ITWILL학원 : 18강 JAVA BY 윤미영강사

1. enum(이넘)의 정의

  • enum은 열거형 데이터 타입이라고 한다.
  • 데이터가 몇 가지 한정된 상수값으로 구성될때 주로 사용.
  • ex) 계절을 나타낼때 String타입보다 enum을 생성하여 봅, 여름, 가을, 겨울의 딱 4개의 값만 설정하는 것이다.

2. enum 사용법

  • 키워드 class대신 enum사용,
  • enum내부에는 상수값 나열 -> 이 상수값들을 enum상수라고 부름
  • 대소문자 구분함
1
2
3
enum Season{
SPRING, SUMMER, FALL, WINTER //=>각각 0,1,2,3의 ordinal값을 가짐
}
  • 선언위치에 따른 변화
    • 같은 클래스 내부에서 enum사용시 (innerEnum) : Season.SPRING
    • 외부 클래스에서 enum사용시 (OuterEnum) : 해당클래스명.Season.SPRING

3. 일반 클래스와 enum 차이점

  • 접근제어자 : public, default만 사용가능
  • 내부적으로 java.lang.Enum클래스 상속 -> 따라서 별도로 다른 클래스 상속받을 수 없다.
  • 여러 인터페이스를 구현하는 것은 상관없다.
  • enum을 이용하면 비교할때 단순히 값만을 비교하는 것이 아니라 타입까지 비교한다. => 안정적인 프로그래밍가능

4. enum메서드

enum타입들은 java.lang.Enum 클래스를 기본적으로 상속받고 있기 때문에 java.lang.Enum 클래스에 선언된 메서드들을 사용가능하다.

메서드명 선언부 설명
name() public final String name() enum상수의 이름을 문자열로 리턴한다
ordinal() public final int ordinal() 0부터 시작하는 enum 상수의 순서를 리턴한다
comparedTo() public final int com[aredTo(E o) enum상수의 ordinal 차이를 리턴한다
values() public static T[] values() enum타입에 선언된 enum상수를 배열로 리턴한다
valueOf() public static T<extends Enum<T>> T valueOf(Class<T> enumType, String name) 문자열로 매핑된 enum상수 객체를 리턴한다

5. enum상수를 이용한 연산

  • enum상수는 주로 비교연산에서 사용된다.

enum을 사용하여 계절별로 다른 출력값을 나타내는 코드를 작성해보자.

  1. OuterEnum사용
  2. 첫번째방법 : if조건문 + comparedTo()
  3. 두번째방법 : switch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
enum Season{
SPRING, SUMMER, FALL, WINTER
}

public class SeasonEnumTest {

//첫번째방법 : if조건문 + comparedTo()
public void compareEnum(Season s){
if(s.equals(Season.SPRING)){
System.out.println(s.compareTo(Season.WINTER));
System.out.println("따뜻한 봄");
}else if(s.compareTo(Season.WINTER) < 0){
System.out.println(s.compareTo(Season.WINTER));
System.out.println("최소한 겨울은 아니잖아요");
}else{
System.out.println(s.compareTo(Season.WINTER));
System.out.println("추운 겨울");
}
}

//두번째방법 : switch
public void enumSwitch(Season s){
switch(s){
case SPRING :
System.out.println("봄");
break;
case SUMMER :
System.out.println("여름");
break;
case FALL :
System.out.println("가을");
break;
default:
System.out.println("겨울");
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
SeasonEnumTest set = new SeasonEnumTest();
set.compareEnum(Season.SPRING);
set.enumSwitch(Season.SPRING);
}
}

6. enum에 멤버 추가 가능

  • enum에도 사용자가 원하는 멤버변수와 멤버메서드를 추가할 수 있다
  • 주의점 : enum상수들만을 정의할때는 세미콜론이 필료없지만 별도의 멤버를 추가하는 경우에는 세미콜론을 추가해서 상수 선언이 끝나는 것을 표시해줘야한다.

7. enum에 생성자 추가 가능

  • enum의 생성자의 접근 제어자 : private만 가능하고 생략가능.
  • 외부에서 해당 생성자를 호출할 수는 없으며 내부에서 상수를 정의하면서 파라미터로 전달.

[ITWILL : JAVA]기본클래스 이외에 자바 구성요소1 : 추상클래스, 인터페이스

ITWILL학원 : 17강 JAVA BY 윤미영강사

1. 추상클래스(Abstract Class)

  • 슈퍼클래스에서 메서드의 선언부까지는 작성가능하지만 구현부는 어떻게 될지 확정되지 않아 작성하기 어려울때 사용
  • 서브클래스들에서 어차피 재정의해서 사용하기 때문에 슈퍼클래스에서 아직 작성할 수 없는 메서드에 대해 선언부에 abstract를 추가 작성하고 구현부를 세미콜론(;)으로 대체한다.
  • 이를 abstract method design pattern 프로그래밍기법이라고 한다.
1
2
3
4
5
6
abstract class A {
//멤버변수, 메서드, 생상자
public abstract void 메서드이름();
}

//abstract()메서드는 중괄호없이 세미콜론만.
  • 추상클래스도 클래스이기에 클래스 구성요소(멤버변수, 메서드, 생성자)를 다 갖춰야하고 그 중 특이하게 abstract메서드를 가지는 클래스를 말한다.
  • 참조변수로 사용가능
  • 객체생성 불가능 : 구현부가 없어서 호출될 수 없기때문에 즉 abstract메서드때문에 미완성
  • 미완성을 어떻게 완성시킬까?
    • 상속하여 재정의! 상속관계의 @override해줘야한다.
    • 반드시 재정의해줘야한다.
    • 재정의를 통해 서브클래스를 객체생성해서 사용할 수 있다.
1
2
3
4
5
6
class B extends A {
@Override
public void 메서드이름(){
//구현부작성
}
}
  • 장점 : 재사용성 향상

참고링크 : 추상 클래스 및 추상 메서드(abstract class and abstract method)

2. 인터페이스

  • 두 시스템 간에 만나는 접점이라는 의미.

  • 모든 메서드가 abstract메서드인 클래스를 인터페이스라고 한다.

  • 자주 사용하는 인터페이스 : GUI(Graphic User Interface).

  • 인터페이스이름의 첫글자는 대문자.

  • 인터페이스는 클래스가 아니라서 클래스와 구성요소의 차이가 있다.

  • 객체생성 불가능 : abstract메서드가 있어서, 즉 메서드가 미완성

  • 미완성을 어떻게 완성시킬까?

    • 재구현! 클래스의 재구현을 통해서 객체생성할 수 있다.

2-1. 인터페이스와 클래스 차이점

  1. 인터페이스와 클래스는 정의법과 구성요소의 차이가 있다.
  • 인터페이스 정의시에 왜 예약어가 생략가능할까?
  • 컴파일러입장에서는 final과 abstract가 너무나 당연하기때문에
1
2
3
4
5
6
7
8
9
10
11
12
//클래스 정의법
class A{
멤버변수
메서드
생성자
}

//인터페이스 정의법
interface Interf {
상수(final 생략가능)
abstract()메서드(abstract 예약어 생략가능)
}
  1. 인터페이스와 클래스 차이
  • 인터페이스 : 다중구현 가능 (헷갈릴까봐 다중상속이라고하지않고 다중구현이라고부른다)
  • 클래스 : 다중상속 불가능
  1. 인터페이스는 객체 생성이 가능할까?
    NOPE! 클래스로 구현한 뒤 클래스를 객체생성할 수있다(업캐스팅)

2-2. 구현(implements)

  • 클래스의 구현을 통해서 인터페이스를 사용할 수 있다.
    • 키워드는 implements 사용!
  • abstract 예약어 생략가능. 따라서 abstract 예약어 안써도 다 생략되어있다고 생각하면됨
    • 왜냐면, 인터페이스안에는 일반변수와 일반메서드 사용할 수 없기 때문에
  • 인터페이스의 모든 abstract method를 재구현하기 위해서 단축키 alt + shift + s를 통해 Override/implements method를 클릭한 뒤 abstract method를 tick해서 재구현해준다.
1
2
3
4
5
6
7
8
//구현 키워드는 implements
class interA implements Interf{
//멤버변수, 메서드, 생성자

//인터페이스가 가지고있는 모든 abstract method를 재구현해야함.
@Override
void method(){}
}

2-3. 인터페이스의 필요성

만들어놓은 라이브러리를 사용하기 위해 인터페이스를 시용한다.

  • 구현의 강제로 표준화
  • 인터페이스를 통해 간접적인 클래스 사용으로 손쉬운 모듈교체지원
  • 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
  • 모듈 간 독립적 프로그래밍으로 개발 시간 단축
    • stub : 아직 개발되지 않은 코드를 임시로 대치하는 역할.

2-4. 인터페이스에 추가할 수 있는 다양한 메서드

  • JDK 1.8버전에서부터 default메서드와 static메서드가 추가되었다.
  • default()메서드 : 구현부가 포함된 일반 메서드
    • interface클래스 구현한 뒤 디폴트메서드는 오버라이딩필요없이 사용가능.
    • 중요 : 접근제어자는 public만 사용가능
    • 문제점 : 인터페이스 다중구현할때 디폴트메서드가 이름이 똑같은 경우 우선순위를 어떻게 두는가? => 아래 규칙으로 충돌을 회피한다.
        1. 조상클래스의 메서드가 가장 높은 우선순위. 조상클래스의 메서드와 인터페이스의 디폴트메서드가 충돌하면 디폴트메서드는 무시된다.
        1. 하나의 인터페이스에서 디폴트메서드를 제공되고 다른 이터페이스에 충돌하는 메서드가 있는 경우(디폴트메서드가 아니더라도) 서브클래스는 반드시 조상의 메서드를 재정의해야한다.
[자바JAVA]클래스 : 패키지, 임포트, 접근제어자, 데이터 은닉과 보호, 싱글턴디자인패턴

[자바JAVA]클래스 : 다형성(Polymorphism)

캐스팅은 OOP(객체지향프로그래밍) 에서 매우 중요하다.
왜냐하면 캐스팅은 OOP의 다형성과 관련이 있기 때문이다.

다형성

java에서 기본형이 아닌 참조형데이터일때, 그리고 상속관계에 있을 때에 한정해서 슈퍼클래스 타입으로 서브클래스 객체를 레퍼런스할 수 있는 성질.

Read More

[ITWILL : JAVA]클래스 : 매개변수위치에 따른 차이(생성자 vs 메서드), private멤버변수 getter와 setter로 가져다쓰기

ITWILL학원 : 13강 JAVA BY 윤미영강사

1. 매개변수위치에 따른 차이

클래스 Book은 책제목과, 저자, 가격을 출력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Book {
private String title;
private String author;
private int price;

public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}

void showInfo(String title, String author, int price ){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

void showInfo(){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %d%n", title, author, price);
}

클래스 TestBook 이라는 새로운 클래스파일을 만들고 메인메서드를 실행해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TestBook {
public static void main(String[] args) {

//생성자파라미터를 통해서 값입력
Book book1 = new Book("운동하는여자", "양민영", 25000);
Book book2 = new Book("채식주의자", "한강", 13500);

//파라미터메서드를 통해서 값입력
Book book3 = new Book();
book3.showInfo("머니", "롭무어", 28000);

//배열생성
Book[] books = new Book[4];

//파라미터가 있는 배열값 넣는 방법2가지

//첫번째방법 : new 이용
books[0] = new Book("며느라기", "수신지", 50000);
//두번째방법 : 객체대입
books[1] = book1;
books[2] = book2;
books[3] = book3;


//배열의 모든값 출력하는 두가지방법
//for문 사용
for(int i=0; i<books.length; i++){
books[i].showInfo();
}

//for each문사용
for(Book b: books){
b.showInfo();
}
}
}
//출력값
책 제목 : 머니, 저자 : 롭무어, 가격 : 28,000

책 제목 : 며느라기, 저자 : 수신지, 가격 : 50000
책 제목 : 운동하는여자, 저자 : 양민영, 가격 : 25000
책 제목 : 채식주의자, 저자 : 한강, 가격 : 13500
책 제목 : null, 저자 : null, 가격 : 0

책 제목 : 며느라기, 저자 : 수신지, 가격 : 50000
책 제목 : 운동하는여자, 저자 : 양민영, 가격 : 25000
책 제목 : 채식주의자, 저자 : 한강, 가격 : 13500
책 제목 : null, 저자 : null, 가격 : 0

1-1 null값이 나오는 이유?

보이는 것처럼 생성자파라미터를 통해서 입력한 값들은 제대로 출력되지만 파라미터메서드를 통해서 입력한 값들은 null로 출력된다.

  • WHY?
    메서드는 파라미터의 값을 받았는데 넣어줄 곳이 없기때문에!

  • 그렇다면 메서드를 어떻게 바꾸면 될까?
    멤버변수를 파라미터값을 대입할수있게 코드를 추가해주면된다

1
2
3
4
5
6
void showInfo(String title, String author, int price ){
this.title = title;
this.author = author;
this.price = price;
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

1-2 어떤 방법이 좋은걸까?

생성자에 파라미터를 받는 방법과 메서드에 파라미터를 받아서 하는 방법 중 어느것이 더 좋은 것일까?

  1. 생성자파라미터
1
2
3
4
5
6
7
8
//1-1.생성자파라미터 생성
public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}
//1-2.생성자파라미터 출력
Book book1 = new Book("운동하는여자", "양민영", 25000)
  1. 파라미터메서드
1
2
3
4
5
6
7
8
9
10
11
//2-1.파라미터메서드 생성
void showInfo(String title, String author, int price ){
this.title = title;
this.author = author;
this.price = price;
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

//2-2. 메서드 출력
Book book1 = new Book();
book3.showInfo("운동하는여자", "양민영", 25000);

둘 다 기능은 동일하지만 생성자파라미터를 쓰는 것이 더 좋다

  • WHY?
    생성자의 기능과 메서드의 기능에 맞게 충실하게 하는 것이 좋기때문이다
    생성자의 기능은 변수를 초기화하는 것이다.
    메서드는 이름에서도 알수있듯이 showInfo()이다. 하지만 파라미터메서드를 생성하면 변수도 초기화하고 출력까지하는 두가지 짬뽕기능을 가지게 된다.

  • 따라서 기능에 맞게 나눠서 코딩하는 것이 좋은 개발습관이다.

2. private 멤버변수값을 사용하는 방법

  • DAO : 주로 jsp model1에서 사용

  • DTO(Data Transfer Object) : 데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 작업을 처리하는 클래스이다.

    • 즉, 객체에서 정보가 중요하다. 즉 멤버변수가 중요한 클래스.
    • 정보전달이 중요한 DTO타입의 클래스들은 값을 생성해주는 getter, setter메서드를 만들어야한다
    • 자바빈으로 불리기도 함.
    • 주로 jsp model2에서 사용
    • vs 기능이 중요한 클래스, 라이브러리가 중요한 변수
  • VO(Value Object)

    • DTO와 비슷한 개념
    • 주로 스프링이용할때 사용
  • 멤버변수는 private을 설정하는 것이 데이터보안상 좋다.
    하지만 private을 쓰게되면 다른 클래스에서 가져가 쓸 수가 없다.
    이럴때 아래 두가지 메서드를 이용한다(개발자들의 약속이다).

2-1. getter메서드와 setter메서드

  • 멤버변수의 특정한 값을 가져오고 싶을땐 get멤버변수명().
  • 멤버변수의 특정한 값을 설정하고싶을땐 set멤버변수명().

이를 getter와 setter라고 부른다.

  • Getters and Setters 단축키 : Alt + Shift + S -> R
    • 또는 source탭 Generate Getters and Setters 클릭

2-2. getter와 setter 사용하는 방법

  • getter와 setter 사용하는 코드
1
2
3
4
5
6
//메인메서드안에서 get메서드쓰는 방법
System.out.println(book1.getTitle()); //값가져오기

//메인메서드안에서 set메서드쓰는 방법
book1.setPrice(20000); //값설정
System.out.println(book1.getPrice()); //값가져오기

2-3. getter와 setter 예시

Book 클래스파일은 아래와 같다.
제목과 저자 가격을 멤버변수로 가지고 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Book {
private String title;
private String author;
private int price;

public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}

void showInfo(){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %d%n", title, author, price);
}

String getTitle(){
return title;
}
String getAuthor(){
return author;
}
int getPrice(){
return price;
}
void setTitle(String title){
this.title = title; //매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.
}
void setAuthor(String a){
author = a; //매개변수명과 멤버변수명이 다른경우 그냥 쓰면 된다.
}
void setPrice(int p){
price = p;
}
}

매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.

실행하는 메인메서드파일은 아래와 같다.

1
2
3
4
5
6
7
8
Book book1 = new Book("운동하는여자", "양민영", 25000);
System.out.println(book1.getTitle());
book1.setPrice(20000);
System.out.println(book1.setPrice());

//출력값
운동하는여자
20000
[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수

[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수

  1. 클래스 class : 실생활에서 도면에 해당하는 것, 객체를 만드는 원판
  2. 객체 object=instance : 도면을 이용해서 찍어내는 제품, 원판을 통해 만들어진 객체
  3. 인스턴스화 : 클래스 - 인스턴스화(=객체화=객체생성=메모리에 객체가 생성됨)-> 객체
Read More