JAVA 공부 2주차 - 필드, 생성자

딩딩당당·2022년 11월 22일
0

필드

필드는 객체의 데이터를 저장하는 곳이다.

  • 필드 선언
    필드 선언은 클래스에 어디든 작성할 수 있지만 메서드와 생성자 중괄호 블록 내부에는 작성할 수 없다.
    필드 선언할 때 초기값을 지정해주지 않으면 타입별 기본값이 들어가게 된다.
타입 필드 [ = 초기값 ] ;
  • 필드 사용
    필드를 사용한다는 것은 필드값을 읽고 변경하는 작업을 말한다.

생성자

생성자는 new 연산자로 클래스로부터 객체를 생성할 때 초기화를 해주는 역할을 한다.

  • 객체 초기화
  1. 객체 초기화는 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것이다.
  2. 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.
  • 기본 생성자
    모든 클래스에는 생성자가 반드시 존재한다. 기본 생성자는 생략될 수 있으며 기본 생성자를 생략했다면 컴파일 과정에서 생성된다.

  • 생성자 선언

클래스( 매개변수, ... ) {
객체의 초기화 코드
}

생성자는 메소드와 비슷한 모양이지만 리턴 타입이 지정되어있지 않고 클래스 이름과 동일하다.
매개 변수 선언은 생략할 수도 있고 여러 개를 선언해도 상관없다.

  • 필드 초기화
    클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다. 만약 다른 값으로 초기화 하려고 한다면 필드를 선언할 때 초기값을 주거나 생서자에서 초기값을 주면 된다. 물론 객체 생성 이후에 초기값을 변경할 수 있지만 생성 시점에서는 값이 같다.

*this
가독성의 이유로 필드 이름과 매개 변수 이름과 동일하게 사용하는 경우가 많은데 이 경우 이름이 동일하기 때문에 생성자 내부에서 해당 필드에 접근할 수 없다. 동일한 이름의 매개 변수가 사용 우선순위가 더 높기 때문이다. 이 때 this를 사용하는데 this는 객체 자신의 참조이다. 객체가 자기 자신을 부를 때 this를 사용한다.

public setMemberid(memberId){
	this.memberId = memberId;
    //  this.필드  = 매개 변수;
}
  • 생성자 오버로딩
    외부에서 접근하는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양할 필요가 있다. 외부에서 접근하는 데이터가 없다면 기본 생성자로 객체를 생성해야하고 일부만 들어온다면 일부만을 이용해 객체를 생성해야한다. 생성자가 하나 뿐이라면 다양하게 객체를 생성할 수 없는데 이를 보완하고자 오버로딩이 제공된다. 생성자 오버로딩이란 매개 변수가 다른 생성자를 여러 개 선언하는 것이다.

  • 다른 생성자 호출 : this()
    생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다. 이 경우에는 필드 초기화 내용은 한 생성자에게만 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.

클래스([매개변수, ...] ) {
	this( 매개변수,..., 값, ...); // 클래스의 다른 생성자 호출
    실행문;
}

this()는 자신의 다른 생성자를 호출하는 코드이며 반드시 생성자 첫 줄에서만 허용된다.this() 매개값은 반드시 생성자의 매개 변수에 맞게 제공해야 한다.

실습!

개인적으로 객체 부분이 가장 어렵고 중요하지 않을까 생각했다. 그래서 눈으로 직접 확인해보고 싶었고 객체, 필드, 생성자의 특성을 이용해서 간단하게 회원가입하고, 로그인하는 프로그램을 만들어 보았다.

Member 필드

public class Member {
    // 필드 선언
    private String memberName;
    private String memberId;
    private String memberPw;
    //

    // 기본 생성자
    Member (){}

    // 매개변수를 가진 생성자
    public Member(String memberName, String memberId, String memberPw) {
        this.memberName = memberName;
        this.memberId = memberId;
        this.memberPw = memberPw;
    }
    // Getter/Setter
    // 보안성 때문에 사용!
    // Getter : 본 필드의 값을 숨긴 채 내부에서 가공된 값을 꺼낼 수 있다.
    // Setter : 필드를 private로 접근을 제어했기 때문에 외부에서 접근할 수 없다. Setter를 이용해
    //          값을 내부에서 가공한 뒤 필드에 넣어준다.

    public String getMemberName(){
        return memberName;
    }

    public void setMemberName(String memberName){
        this.memberName = memberName;
    }

    public String getMemberId(){
        return memberId;
    }

    public void setMemberId(String memberId){
        this.memberId = memberId;
    }

    public String getMemberPw(){
        return memberPw;
    }

    public void setMemberPw(String memberPw){
        this.memberPw = memberPw;
    }

}

Service 클래스

import java.util.Scanner;

public class MemberService {

    private Scanner sc = new Scanner(System.in);

    private Member memberInfo = null; // 회원가입이 저장될 객체
    private Member loginMember = null; // 로그인이 저장될 객체

    public MemberService() {} // 기본 생성자! ( 생략 가능! 아마도?.. )

    public void display(){ // 메뉴화면 메소드

        int  menu = 0;

        do{ // 무조건 한번은 실행됨!
            System.out.println("===== 회원 정보 관리 프로그램 =====");
            System.out.println("1. 회원 가입");
            System.out.println("2. 로그인");
            System.out.println("0. 종료");
            System.out.print("메뉴 입력 >> ");
            menu = sc.nextInt();
            sc.nextLine();

            switch(menu){
                case 1 :
                    System.out.println(signUp()); break;
                case 2 :
                    System.out.println(login()); break;

                case 0 : System.out.println("프로그램을 종료합니다..."); break;

                default : System.out.println("잘못 입력 하셨습니다. 다시 입력 해주세요.");
            }



        }while(menu!=0);
    }
    public String login(){ // 로그인 메소드


        System.out.println("========== 로그인 ==========");

        if(memberInfo == null) { // 화원가입 하지 않았다면..!

            return "회원 가입부터 진행 해주세요.";
        }
        System.out.print("아이디> ");
        String memberId = sc.next();
        System.out.print("비밀번호> ");
        String memberPw = sc.next();

        if( memberId.equals(memberInfo.getMemberId()) &&
                memberPw.equals(memberInfo.getMemberPw())){ // 회원가입 내용과 비교하고, 맞았을 때만 참조!

            loginMember = memberInfo; // 로그인한 사용자만 사용할 수 있는 기능을 만들기 위함

            return loginMember.getMemberName() + "님 환영합니다."; // 로그인 메세지
        } else{
            return "아이디 또는 비밀번호가 일치하지 않습니다."; // 틀렸을 때!
        }

    }

    public String signUp(){ // 회원가입 메소드

        System.out.println("========== 회원가입 ==========");

        System.out.print("닉네임> ");
        String memberName = sc.next();
        System.out.print("아이디> ");
        String memberId = sc.next();
        System.out.print("비밀번호> ");
        String memberPw = sc.next();
        System.out.print("비밀번호 확인> ");
        String memberPw2 = sc.next();

        if(memberPw.equals(memberPw2)){ // 비밀번호가 일치하면 객체 생성!

            memberInfo = new Member(memberName, memberId, memberPw);

            return "회원가입 성공!";
        }else{
            return "비밀번호가 일치하지 않습니다.";
        }



    }
}

Main 클래스

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        MemberService service = new MemberService();
        // MemberService에 display 메소드 실행!
        service.display();
    }
}

하.. 나는 왜 글만 읽어서는 이해하기 어려울까 단어의 뜻에 집중하지 말고 원리를 이해하는데 좀 더 집중해보거나 구글링에 좀 더 익숙해질 필요가 있을 것 같다.


내일 해야할 일

오전 : 메소드 개념 정리, 팀 스터디

오후

챌린지 알고리즘 문제 풀기
인스턴스 멤버와 정적 멤버
회원 관리 프로그램 업그레이드 해볼지 고민...
시간이 남으면 접근제한자까지
( 알고리즘이 순탄하길..! )

profile
자바공부해요흑흑

0개의 댓글