국비학원 5일차 : 로그인사이트, 회원가입, 클래스

Digeut·2023년 2월 28일
0

국비학원

목록 보기
5/44

로그인 구현

import java.util.Scanner;

// 로그인 프로세스 구현
public class SignIn {

	
	// 입력
	// 아이디, 비밀번호
	public static void main(String[] args) {
		final String ID = "qwer1234" ; //상수는 대문자로!
		final String PASSWORD = "qwer1234" ; 
		
		//1. 사용자로부터 아이디와 비밀번호 입력받음
		Scanner scanner = new Scanner(System.in);
		System.out.println("아이디와 비밀번호를 입력하세요.");
		String userId = scanner.nextLine();
		String userPassword = scanner.nextLine();
		
		//2. ☆모두 입력 여부 확인 , 입력 안되었다면 모두 입력하라고 출력 
        //(아이디와 비밀번호 입력했는지 검증)
		// userId 와 userPassword 변수가 비었는지 확인
		// 문자열에서 값이 비었는지 확인하는 기능(메서드)이 존재
		// string(변수).isEmpty() : 비었으면 true, 아니면 false
        
//		if (userId.isEmpty()) { //큰 흐름에서 벗어나는게 if에서 실행되게 하면 깔끔
//			System.out.println("모두 입력하세요.");
//			//코드블럭내의 코드를 종료시키려면 break, 
			//함수 스레드 자체를 종료는 return -> 클래스할때 설명
//			return;
//		} 

//		if(userPassword.isEmpty()) {
//			System.out.println("모두 입력하세요.");
//			return;
//		}
		//↑위 코드 주석처리한 이유
        //입력을 검증하는건 프로세스가 하나! 그리고 코드가 중복되는걸 피해야한다.
        //->논리연산자 사용해서 하나로 만들기 &&는 곱하기연산, ||는 더하기연산
        
		if(userId.isEmpty() || userPassword.isEmpty()) { 
        //같은 라인에 있다면 or로 묶어주기(세로정렬에서)
			System.out.println("모두 입력하세요.");
			return;
		}
		
//		if(userId.isEmpty()) { 
//			if(userPassword.isEmpty()) {
//			System.out.println("모두 입력하세요.");
//			return;
//		} 
		//↑위 코드 주석처리한 이유
        //입력을 검증하는건 프로세스가 하나! 그리고 코드가 중복되는걸 피해야한다.
        //이런식의 조건은 같은 라인의 조건이 아니기때문에 and로 묶어서 표현해야 한다.
		
		//변수에 저장한다 = 메모리 공간에 저장
		
		// 3. 사용가 입력값과 저장된 값이 같은지 '검증'(if로 해야된다) 
        //저장소 값(맨 위에 지정한 상수)과 실제 입력값 비교
		// string.equals(비교대상) : 같으면 true, 다르면 false
		
//        if(userId.equals(ID)/*== ID*/ && userPassword.equals(PASSWORD)) { 
        // ==의 경우 기본 데이터타입에서 사용, String은 기본 데이터 타입이아니다! 
        // ==말고 equals 사용.
//			System.out.println("성공");
//		} 
        //정상결과를 if안에 넣으면 안된다! 프로세스상으로는 실패..!!
		//비정상이 빠져나가는 루트로 if문에 엮여야한다.
		
		if(!userId.equals(ID) || !userPassword.equals(PASSWORD)) { 
        //비정상경로를 하려면 전부 부정을 하면된다.
			System.out.println("로그인 정보가 일치하지 않습니다.");
			return; //메인 메소드가 종료가 된다.
		}
		
		System.out.println("성공"); 
	}
	
	// 결과
	// 성공, 실패(모두 입력하지 않았을 때, 정보가 일치하지 않을 때)
	
	// 로그인 실패할 적에 로그인 정보가 일치하지 않습니다.라고 요즘에는 뜬다
	// 옛날에는 아이디가 일치하지 않습니다 / 비밀번호가 일치하지 않습니다라고 떴는데 요즘은 바뀜.
}

회원가입

DTO(Data Transfer Object) : 로직을 가지지 않은 데이터 객체 getter, setter 메소드만 가진 클래스

package Sample.SignIn;

import java.util.Scanner;

class SignUpDto{
    String userId;
    String userPassword;
    String userPasswordCheck;
    String userName;

    //사용자 입력층이 있고 데이터가 저장하는 층이 있는데 그 층들을 Dto..?
}

//회원가입 프로세스 구현
// ☆모든 프로세스 첫번째 모두 입력되었는지!☆
// 아이디 중복 확인
// 비밀번호가 동일한지
// (비밀번호 패턴확인) 지금은 어려워서 안함.

public class SignUp {

    // 입력
    // 아이디, 비밀번호, 비밀번호 확인, 이름
    
    public static void main(String[] args) {
        //3번의 아이디 중복체크를 위한 미리 만들어두는 아이디 
        //(모두 변수로 설정해도 좋지만 관리에 용이하게 스트링 배열로 만들기)
        String[] idList = {"qwer" , "asdf", "zxcv"}; 
        //다차원 배열, 문자열은 기본데이터 타입아니다.

        // 1. 사용자로부터 아이디, 패스워드, 패스워드 확인, 이름을 입력 받음
        // 변수 명명할때 꼭 명명 규칙 따르기! lowerCamelCase 사용하기
        Scanner scanner = new Scanner(System.in);

        SignUpDto dto = new SignUpDto();

		//클래스 사용하지 않고 하나하나 변수 설정
//		System.out.println("아이디 : ");
//		String userId = scanner.nextLine();
//		System.out.println("패스워드 : ");
//		String userPassword = scanner.nextLine();
//		System.out.println("패스워드 확인 : ");
//		String userPasswordCheck = scanner.nextLine();
//		System.out.println("이름 : ");
//		String userName = scanner.nextLine();

        // 1-1클래스 사용시
        System.out.println("아이디 : ");
        dto.userId = scanner.nextLine();

        System.out.println("패스워드 : ");
        dto.userPassword = scanner.nextLine();

        System.out.println("패스워드 확인 : ");
        dto.userPasswordCheck = scanner.nextLine();

        System.out.println("이름 : ");
        dto.userName = scanner.nextLine();

//		System.out.println(userId + userPassword + 
			userPasswordCheck + userName);

        // 2. 모두 입력받았는지 검증
        // String.isBlank() : 문자열이 비었거나, 띄어쓰기만으로 구성됐을때 true 반환,
        // 아니면 false
        // **.isEmpty는 공백도 입력된걸로 인식한다.

//		if (userId.isBlank() || userPassword.isBlank() ||
//				userPasswordCheck.isBlank() || userName.isBlank()) { 
			//변수들중 하나라도 비면 F로 해야하니까 or연산자로!
//			System.out.println("모두 입력하세요.");
//			return;
//		}

        // 2-1 클래스 사용시
        if (dto.userId.isBlank() || dto.userPassword.isBlank() ||
                dto.userPasswordCheck.isBlank() || dto.userName.isBlank()) { 
                //변수들중 하나라도 비면 F로 해야하니까 or연산자로!
            System.out.println("모두 입력하세요.");
            return;
        }

        // 3. 아이디 중복 체크 (선행적으로 이미 존재하는 아이디가 있어야한다!)
        // (실제로 이렇게 하진 않음.) for문이랑 for each문으로 비교
        // for문 배열 접근할때 많이 쓴다

        // 3-1 일반 for문 사용 //직접 접근
        // 반복문 돌면서 값을 바꿔야한다면 for문 사용해야한다.
//		for (int index = 0 ; index < idList.length ; index++) {
//			if(userId.equals(idList[index])) { 
			//idList[i].equals(userId)와 읽는게 조금 다르다 -> 뭐지
//				System.out.println("중복되는 아이디 입니다.");
//				return;
//			}
//		}

        // 3-2  for each 문 사용 //복사
        // 단순 읽기만 하고 변경하지 않는다면 for each문이 더 깔끔.

//		for (String id : idList) {
//			if(userId.equals(id)) {
//				System.out.println("중복되는 아이디 입니다.");
//				return; //이걸 안하면 끝이 안나고 끝까지 코드가 읽어지게 된다 
						// '중복되는 아이디입니다. 성공' 이렇게 출력됨!
//			}
//		}

        // 3-3클래스 사용시
        for (String id : idList) {
            if(dto.userId.equals(id)) {
                System.out.println("중복되는 아이디 입니다.");
                return; 
            }
        }

        // 4. 비밀번호 확인
//		if (!userPassword.equals(userPasswordCheck)) { 
			//비정상을 if문 안에 들어오게 해야한다!
//			System.out.println("비밀번호가 서로 다릅니다.");
//			return;
//		}
//		System.out.println("성공");

        //클래스 사용시
        if (!dto.userPassword.equals(dto.userPasswordCheck)) { 
            System.out.println("비밀번호가 서로 다릅니다.");
            return;
        }
        System.out.println("성공");

        //다른 타입의 변수를 하나로 묶어서 관리 : 클래스 (객체지향 언어 자바의 기본)
    }
    // 결과
    // 성공, 실패 (모두 입력하지 않았을때, 아이디가 중복 될 때, 비밀번호가 서로 다를때)
}

객체지향 5원칙

S.O.L.I.D.
1. SRP
2. OCP 유지보수에 용이
3. LSP
4. ISP 전화는 전화대로, 메시지는 메시지대로, 기능 단위를 제일 작게 나누기
5. DIP

클래스

class

객체를 정의해 놓은것
객체를 생성하는 기반
객체를 정의하는 틀 또는 설계도

클래스는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메서드로 구성됨
필드 : 클래스에 포함된 변수 혹은 상수
메서드 : 어떠한 특정 작업을 수행하기 위한 명령문의 집합

object

실제로 존재하는 모든 것들 (사람, 사물, 추상적인 개념 등등)
클래스로 생성된 실체

클래스 생성된 각각의 객체는 독립적으로 존재함.
같은 클래스로 생성된 객체라 하더라도 각각이 가지고 있는 '속성 값'은 다를 수 있다.
(일반적으로 다름)

클래스 선언

// 클래스 선언 방법
// class 클래스명 { 속성1, 속성2, ..., 기능1, 기능2, ... }
// 속성 : 변수, 특성, 필드, 상태
// 기능 : 메서드, 함수, 행위
class SmartPhone {

//속성	// 기종
         String modelName;
         // 색상
         String color;
         // 메모리
         int memory;
         // 전화번호
         String telNumber;
         // 전원
         boolean power;

//기능	// 전화 걸기
        void call(String toTellNumber) {
            System.out.println(toTellNumber + "로 전화를 겁니다.");
        }
        // 영상 시청
        void showVideo() {
            System.out.println("영상을 시청합니다.");
        }
        // 메시지
        void sendMessage(String message, String toTelNumber) {
            System.out.println(toTelNumber + "로 " + message + "를 보냅니다.");
        }
        // 전원 켜고 끄기
        void setPower() {
            power = !power;
    	}
}

인스턴스

특정 클래스로 생성된 객체를 '인스턴스'라 함
클래스로 객체를 생성하는 행위를 '인스턴스화'라고 함

인스턴스 선언

// 인스턴스 선언 방법
// 클래스 참조변수명(인스턴스명)
SmartPhone iphone14; //저장하는 '공간'을 만든것

인스턴스 생성

// 인스턴스 생성 방법
// 참조변수명 = new 클래스명(); //메모리 주소를 갖는다!
iPhone14 = new SmartPhone();
SmartPhone iPhone14Pro = new SmartPhone(); 
//같은 틀을 가졌으나 iphone14와 iphone14Pro는 다르다.
//배열은 늘 같은 타입, 클래스는 다른 타입들이 섞여 있는것 
// 구조체에 메소드까지 포함된게 클래스라고 한다

System.out.println(iPhone14);
System.out.println(iPhone14Pro); //메모리 주소가 출력된다.
//이때 둘의 메모리 주소는 다르다.

인스턴스 속성 접근 및 기능 사용

속성 접근 : 참조변수.멤버변수(속성);
기능 사용 : 참조변수.메서드([매개변수[, ...]]);
([]안에 넣는건 필요하면 넣고, 안필요하면 안넣는것.)

iPhone14.modelName = "IPHONE";
iPhone14.color = "black";
iPhone14.memory = 512;
iPhone14.telNumber = "010-1234-5678";
iPhone14.power = false;

System.out.println(iPhone14.modelName); //IPHONE
System.out.println(iPhone14.telNumber); //010-1234-5678
System.out.println(iPhone14Pro.modelName); // null
System.out.println(iPhone14Pro.memory); // 0
System.out.println(iPhone14Pro.power); // false
////iphone14Pro는 초기화하지 않았다.

//modelName은 String타입 (기본 데이터 타입 아니고 참조형)
//기본 데이터 타입은 기본 메모리가 있다(int는 4byte) 
//아무것도 지정하지 않으면 처음 저장되는 값은 전부 : 0 
//(boolean도 전부 0이라 false로 나오는것)
//String은 기본형 데이터 타입아니고 참조형. 
//특정한 위치를 바라보는데 그 위치를 지정하지 않음. 메모리 주소를 지정하지 않았다 : null
//SmartPhone galaxy = null; //아직 값을 지정하지 않겠다 
// 메모리 공간만 할당. 메모리 주소가 없고 전체 공간만 있는상태
iPhone14.call("010-2222-2222"); //010-2222-2222로 전화를 겁니다.
//ctrl누르고 기능 누르면 기능에 들어갈수 있다.
iPhone14.showVideo(); //영상을 시청합니다.
System.out.println(iPhone14.power); //false
iPhone14.setPower();
System.out.println(iPhone14.power); //true
iPhone14Pro = iPhone14; //같은 메모리 주소를 갖게 된다.
iPhone14Pro.telNumber = "010-9999-9999"; 
//같은걸 바라보게 되서 telNumber를 같은 값을 가지게 된다.
System.out.println(iPhone14Pro.telNumber); // 010-9999-9999
System.out.println(iPhone14.telNumber); // 010-9999-9999

//바꿔도 안바뀌는건 for이랑 for each문이었고.. 메모리주소관련은 바뀐다고했던가
//배열은 같은 방향성을 가지고 같은것을 바라보는 개념. 
// 그래서 직접 접근시 같이 바뀌게 된다?

객체 배열

// 클래스명[] 객체배열명 = new 클래스명[길이];
SmartPhone[] smartPhoneList = new SmartPhone[3];

smartPhoneList[0] = iPhone14;
smartPhoneList[1] = iPhone14Pro;
smartPhoneList[2] = new SmartPhone(); //인스턴스 생성 , 주소가 들어가는 것

///*1번*/SmartPhone smartPhone = new SmartPhone(); /*인스턴스 생성 */
for (int index = 0 ; index < smartPhoneList.length; index++) {
	/*2번*/SmartPhone smartPhone = new SmartPhone();
	smartPhone.telNumber = "010-1111-111" + index;
	smartPhoneList[index] = smartPhone;
}

for(SmartPhone phone : smartPhoneList) {
	System.out.println(phone);
	//1번 위치에 있으면 모든 배열의 메모리 주소가 동일
	//2번 위치에 있으면 모든 배열의 메모리 주소 다름
	System.out.println(phone.telNumber);
	//1번 위치에 있으면 모든 배열의 값이 010-1111-1112
	//2번 위치에 있으면 010-1111-1110~010-1111-1112까지 출력
}
profile
개발자가 될 거야!

0개의 댓글