나의 수업일지

인천 일보 아카데미 8일차 메소드로 만들어보기/ArrayList 알아보기

2023. 3. 5. 20:51
  • 클래스_복습
> 전날에 배운 내용을 한번 더 사용해보며 복습하는 시간을 가졌습니다

>먼저 클래스의 구성 요소 3가지 필드 생성자 메소드 입니다
==========필드============================
public class People {
    private String name;    <private를 사용한 모습입니다 이런경우 같은 클래스에서만 수정이 가능합니다
    private int age;    <이는 다른 클래스에서 필드를 함부로 수정이 불가능하게 하기 위함입니다


=========생성자===========================    
    public People() { < 생성자 메소드입니다 

    }

    public People(String name,int age) { < 이렇게 생성자 메소드를 사용하는경우
        this.name = name;    < 기본 생성자가 자동으로 만들어지지 않기 때문에
        this.age = age;        < 위에서 생성자를 수동으로 작성해준 모습입니다
    }

===========메소드==============================
    > 필드에 있는 변수들에게 private 로 접근 제한을 걸어 두었기 때문에
    > 같은 클래스에서만 정보 변경이 가능합니다
    > 그렇기에 정보를 클래스로 가져와 대입하고 다른 클래스로 불러오기 위한 메소드를 작성한 모습입니다
    > 정보를 가져와 필드에 대입할 메소드는 메소드 이름 앞에 set을 사용하였고
    > 필드의 정보를 다른 클래스에서 사용할때는 메소드 이름 앞에 get을 붙여 가독성을 높였습니다

    public String getNane() { < 입력된 정보를 받아오는 메소드로 받아올 변수의 타입이 String이기에 리턴 타입은 String입니다
        return  this.name;    < this.name으로 필드에 있는 name 변수를 리턴한다는 뜻입니다
    }
    public void setName(String name) { < 입력 정보를 필드에 있는 변수에 저장하는 메소드입니다
        this.name = name;        < 정보를 가져만오기 때문에 리턴 타입은 void(없음)이고 매개변수를 String name으로 하였습니다
    }                    < 필드에 있는 name변수에 매개변수로 받은 name을 대입하게 합니다

    public int getAge() {
        return  this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int ageUp() { < ageUp메소드를 사용하면 필드의 age에 1을 증가시키고 리턴으로 1증가한 age를 돌려줌
        this.age++;        <age의 타입은 int이기 때문에 리턴 타입도 int로 설정함
        return this.age;
    }
}

========================================================================

> 이제 작성된 클래스를 메인 클래스에서 사용해보도록 하겠습니다

public class People_main {
    public static void main(String[] arge) {
        People p1 = new People(); < 해당 클래스에서 People이라는 클래스를 사용가능하게 함
//        p1.name = "홍길동"; < 클래스의 변수가 private이기 떄문에 이렇게 직접 넣을 수 없음
        p1.setName("홍길동"); < 그렇기에 해당 클래스에 있는 메소드를 이용하여 대입하게 한 모습

//        System.out.println(p1.name); 마찬가지로 private이기에 직접 넣어지지 않아 출력도 불가능하다
        System.out.println(p1.getNane()); < 그렇기에 People 클래스에서 설정한 get메소드를 이용해 출력한 모습
        System.out.println(p1.getAge());
        if(true) {
            System.out.println(p1.ageUp()); < ageUp이 잘 작동 되는지 확인하는 모습
        }

        People p2 = new People("이순신", 90);
        System.out.printf(p2.getNane()+"\n"+p2.getAge()+"\n");

        if(true) {
            System.out.println(p2.ageUp());
        }

    }
}

 

  • 만들어보기_응용_Util_User
> 2가지 class를 동시에 사용해보기 위해 먼저 class를 2가지 만들어보도록 하겠습니다
import java.util.Scanner;

    > sc.hasNextInt() > 입력받은 수가 숫자면 참 문자면 거짓
    > sc.nextLine() > 띄어쓰기까지 문장을 입력받을 수 있음

public class Util {
========필드==============================================

	int number;

=======생성자==============================================

    > 이번 클래스에서는 생성자 메소드를 사용하지 않기 때문에
    > 기본생성자가 자동으로 만들어집니다
    > 그렇기에 생성자를 따로 만들어주지않아도 상관 없습니다
    
=======메소드=============================================

	> 먼저 만들어보기에서 사용할 숫자 체크 메소드입니다
    
    	public int numberCheak() {
		int result;
		Scanner sc = new Scanner(System.in);
		while (true) {
			if (sc.hasNextInt()) {
				result = sc.nextInt();
				break;
			} else {
				System.out.println(str + "숫자만 입력 >");
				sc.nextLine();
			}
		}
		return result;
	}
    
    	> 풀이입니다 
    
	public int numberCheck() { > 리턴은 숫자만 받기 때문에 리턴 타입은 int로 하였습니다
    
		int result; > 정보 저장에 이용될 int변수를 result로 선언한 모습입니다
        
		Scanner sc = new Scanner(System.in); . 사용자가 메소드에 입력이 가능하게 만들기 위한 scanner입니다
        
		while (true) { > 반복문을 이용하여 조건에 충족되지 않으면 메소드가 계속 작동하게 만들었습니다
        
			if (sc.hasNextInt()) { > 여기서 sc.hasNextInt()는 입력받은 값이 문자라면 거짓 숫자라면 참을 뜻합니다
				result = sc.nextInt(); > if문의 조건으로 사용하였기에 문자라면 else로 빠지고 숫자라면 if문 안으로 들어오게 됩니다
				break; > 숫자를 입력받은 경우 result에 입력 값이 대입되고 반복문을 빠져나가고 값을 return하여 메소드를 마칩니다
                
			} else {
				System.out.println("숫자만 입력 >"); > 위의 hasNextInt에서 문자를 받은 경우 else로 넘어옵니다
				sc.nextLine(); > 숫자만 입력할 수 있다는 문구를 출력하고
			}			> 이전에 사용자가 입력한 문자는 사라지지 않기 때문에 sc.nextLine으로 받아줄 스캐너를 생성한 모습입니다
		}
		return result; > 이렇게 숫자를 입력받으면 result에 담겨 돌려 받게 됩니다
	}

	> 아이디의 갯수를 제한하는 메소드

	public String lengthCheak(String id1) {
		String length;
		Scanner sc = new Scanner(System.in);
		while (true) {
			length = sc.next();
			if (length.length() <= 6) {

				break;
			} else if (length.length() > 6) {
				System.out.print("6글자까지 가능합니다 >");
				sc.nextLine();
			}
		}
		return length;
	}
    
    >풀이 입니다
    
    > 아이디는 문자,숫자 둘다 사용하기에 리턴 타입을 String으로 하였습니다 
    > 매개 변수에는 입력받은 아이디가 들어가게 하였습니다
	public String lengthCheak(String id1) { 
    
		String length; > 리턴 값을 저장할 변수 length를 만들어줍니다
        
		Scanner sc = new Scanner(System.in); > 사용자가 메소드에서 입력 가능하도록 scanner를 사용하였습니다
        
		while (true) { > 조건에 만족할때까지 반복하기 위해 반복문 while을 이용하였습니다
        
			length = sc.next(); >사용자가 입력한 아이디를 length에 대입하게 하였습니다
            
			if (length.length() <= 6) { > if문을 이용하여 대입받은 length의 길이가 6보다 작거나 같다면 반복문을 빠져나가도록 하였습니다

				break;
			} else if (length.length() > 6) { > else if로 입력받은 아이디의 길이가 6보다 크다면
				System.out.print("6글자까지 가능합니다 >"); > 6글자까지 입력 가능하다는 문구를 출력합니다
				sc.nextLine(); > 입력받은 문구는 sc.nextLine으로 빠지며 다시 반복문을 반복합니다
			}
		}
		return length; > 조건에 충족하게된 length는 리턴으로 돌려주며 메소드를 마칩니다
	}

====================================================================================

> 만들기에 사용 할 2번째 class입니다
> 2번째 class는 위에서 설명을 마쳤기 때문에 이해가 힘들다면 글을 처음부터 다시 읽어주세요

========필드============================================

    private String name;
    private String id;
    private String pw;
    
=======생성자============================================

    public User() {

    }
    public User(String name ,String id,String pw) {
        this.name = name;
        this.id = id;
        this.pw = pw;
    }
    
=======메소드============================================
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPw() {
        return pw;
    }

    public void setPw(String pw) {
        this.pw = pw;
    }

    public void print() {
        System.out.printf("%s\t%s\t%s\n",name,id,pw);
    }

}

 

  • 만들어보기_응용_매우_어려움
> 위에서 만든 2가지 class를 응용하여 회원가입 프로그램 만들어보기!

        Scanner sc = new Scanner(System.in); > 사용자가 콘솔에 입력 가능하게하는 scanner
        User[] list = new User[100]; > User class의 배열을 만들고 이름을 list로 선언 후 100칸으로 만든 모습
        int cnt = 0; > 배열의 방번호 역활을 해줄 변수 cnt

        while (true) { > 사용자가 메뉴와 입력 공간을 확인 할 수 있게 메뉴를 while로 무한 반복
        
        	Util util = new Util(); < Util class를 utill로 현재 class에서 사용가능하게 함
            System.out.println("====회원가입====
            System.out.println("1.회원가입 2.로그인 3.리스트 4.검색 0.종로");
            System.out.print("메뉴 선택 >");
            int menu = util.numberCheak(); < 입력받은 메뉴를 utill로 체크하고 int menu에 대입하게함

            if (menu == 1) { < menu가 1인경우 사용자에게 새로운 메뉴창을 보여줌
                System.out.print("이름 > ");
                String name = sc.next();
                System.out.print("아이디 >");
                String id1 = util.lengthCheak(""); < 입력받은 아이디를 util.lengthCheak("")를 이용하여 길이를 체크하고 di1에 대입함
                System.out.print("비밀번호 >");
                String pw = sc.next();
                User user = new User(name, id1, pw); < 입력받은 정보를 user class의 생성자 메소드에 대입하고 실행
                list[cnt] = user; < 입력받은 정보를 list에 대입하고
                System.out.println("회원가입 완료!");
                cnt++; < 마지막에 방번호를 한칸 증가시키며 빠져나감
                
            } else if (menu == 2) { < menu가 2인경우 실행
            
            >로그인 id,pw를 입력받고 각각 변수에 저장함
                System.out.print("로그인 id >");
                String id = sc.next();
                System.out.print("로그인 pw >");
                String pw = sc.next();

                for (int i = 0; i < cnt; i++) {
                    if (id.equals(list[i].getId()) && pw.equals(list[i].getPw())) {
                        System.out.println(list[i].getName() + "님 로그인 성공!");
                        break;
                        
			> for문을 이용하여 i가 cnt보다 작을때 1씩 증가하게함
            > 1씩 증가하는 i를 이용해 리스트의 칸번호를 열어보며
            > 입력받은 id,pw가 일치한다면 "로그인 성공 "을 출력하며 반복문을 빠져나감
            
                    } else if (i == cnt - 1) {
                        System.out.println("로그인 실패!");
                        
                        > i 가 cnt -1 즉 정보가 들어있는 list의 끝칸의 번호와 같아져도 위의 조건에 맞지 않는 다면
                        > "로그인 실패"를 출력하게함
                    }
                    
                }

            } else if (menu == 3) { > 배열을 이해했다면 충분히 이해 가능한 menu 3
                System.out.println("이름\t아이디\t비밀번호");
                System.out.println("======================");
                for (int i = 0; i < cnt; i++) {
                    list[i].print();
                }

            } else if (menu == 4) { > menu 2번을 이해했다면 충분히 이해 가능한 menu4
                System.out.print("검색 아이디 >");
                String id = sc.next();
                System.out.println("이름\t아이디\t비밀번호");
                System.out.println("======================");
                for(int i = 0 ; i < cnt ; i ++) {
                    if(id.equals(list[i].getId())) {
                        list[i].print();
                    }
                }
            } else if (menu == 0) {
                break;
            } else {
                System.out.println("없는 메뉴입니다");
            }
        }
        System.out.println("시스템을 종료합니다");
    }

}

 

  • Array_List를 알아보자
public class ArrayList_연습 {

    public static void main(String[] args) {
        Member[] mList = new Member[10]; < Member class를 배열 mList로 선언 후 10칸으로 만듬
        Member m = new Member(); > Member class를 m으로 선언 후 해당 class에서 사용할 수 있게만듬
        
        > 배열의 칸을 다 출력하여 정보가 몇번까지 들어있는 알 수 있는 방법
        > 빈 배열의 칸은 null로 출력됨
        mList[0] = m;
        mList[1] = m;
        mList[2] = m;
        for(int i = 0 ; i < mList.length; i++) { // length는 칸의 길이
            System.out.println(mList[i]);
        }
        
        
        > ArrayList를 이용한 경우 배열을 한 공간에 넣고 뺴내와 사용하는 방식인데
        > 이것의 이해를 돕는 예시문
        
        List<Member> list = new ArrayList<>(); > Meber class를 ArrayList로 만든 모습
        list.add(m); < ArrayList에 정보를 담는 방법
        list.add(m); < 
        list.add(m); < 

        for(int i = 0 ; i < list.size();i++) { // szie는 들어간 것의 갯수
            System.out.println(list.get(i));
        }
        
        > for문을 이용하여 ArrayList에 정보가 몇가지 들어있는지 알아볼 수 있는 방법
        
        for(Member mm : list) { //향상된 for문
            System.out.println(mm);
        }
        
        > 향상된 for문을 이용하여 ArrayList에 정보가 몇가지 들어있는지 알아볼 수 있는 방법
        > list를 mm에 대입하며 출력을 반복하는 방식
    }

}

 

  • 응용_ 만들기 _ 멤버 _관리_ 프로그램
> 멤버 관리 프로그램을 만들기 위해 사용한 class

=======필드====================================
public class Member {
    private int id;
    private String email;
    private String pw;
    private String name;
    private String joinDate;

=======생성자=====================================
    public Member() {

    }

    public Member(int id , String email , String pw , String name , String joinDate) {
        this.id = id;
        this.email = email;
        this.pw = pw;
        this.name = name;
        this.joinDate = joinDate;
    }


========메소드======================================
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPw() {
        return pw;
    }

    public void setPw(String pw) {
        this.pw = pw;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJoinDate() {
        return joinDate;
    }

    public void setJoinDate(String joinDate) {
        this.joinDate = joinDate;
    }

    public void print() {
        System.out.printf("%d\t%s\t%s\t%s\t%s\n",id,email,pw,name,joinDate);
    }

}

================================================================================

        Scanner sc = new Scanner(System.in); > 사용자가 콘솔에 입력 가능하게하는 scanner
        Util util = new Util(); > Util class를 util로 해당 class에서 사용 가능하게함
        List<Member> list = new ArrayList<>(); class Member를 ArrayList로 설정함
        int id = 0;

        while (true) {
            System.out.println("1.멤버등록 2.멤버리스트 3.검색 4.멤버수정 5.멤버삭제 0.종료");
            System.out.println("메뉴 선택 >");
            int menu = util.numberCheck(); > util에 만들어둔 메소드를 이용해 숫자만 입력 받을 수 있게함

            if (menu == 1) { < menu가 1일 경우 실행
                Member member = new Member(); > Member class를 member로 해당 class에서 사용 가능하게함
                member.setId(++id); > ++id = 전치 증강 id++ = 후치증강 후치는 줄이 ;로 끝나면 증강
                System.out.println("이메일 입력 >");
                member.setEmail(sc.next()); > 입력받은 이메일을 member의 필드에 저장함                 
                list.add(member); > ArrayList에 여기까지의 meber의 정보를 객체로 저장함
                System.out.println("비밀번호 입력 >");
                member.setPw(sc.next()); > 입력받은 비밀번호를 member의 필드에 저장함
                System.out.println("이름 입력 >");
                member.setName(sc.next()); > 입력받은 이름을 member의 필드에 저장함
                System.out.println("멤버등록 성공!");

            } else if (menu == 2) { menu가 2일때 실행
                System.out.println("아이디\t이메일\t\t비밀번호\t이름\t가입일");
                System.out.println("-------------------------------------");
                for (Member mm : list) { > 향상된 for문을 이용해 list를 mm에 대입하며 프린트
                    mm.print();
                }

            } else if (menu == 3) { < menu가 3일때 실행
                boolean find = false; > 조건문에 사용하기위한 find 에 false를 대입
                System.out.println("검색 아이디 >");
                int searchId = sc.nextInt(); < 검색 아이디를 입력받고 searchId에 저장함
                System.out.println("아이디\t이메일\t\t비밀번호\t이름\t가입일");
                System.out.println("-------------------------------------");
                for (Member mm : list) { 향상된 for문을 이용하여 list 안에 저장된 정보를 mm에 대입하며
                    if (mm.getId() == searchId) { 조건문 if에 입력받은 id와 맞는 정보가 있는지 대조함
                        mm.print();
                        find = true;
                        break;
                    } > 맞는 정보가 있다면 해당 list의 정보를 출력하고 find를 true로 바꾸며 반복문을 빠져나감
                }
                if(!find) { 위의 for문에서 맞는 정보가 없어 내려오면 find는 계속 false이기 때문에 해당 조건문을 실행
                    System.out.println("없는 아이디 입니다"); > "없는 아이디"를 출력하며 해당 메뉴를 빠져나감
                }
            } else if (menu == 4) { > menu가 4번일 경우 실행
                boolean find = false; > 조건문에 사용하기 위핸 find에 false를 대입함
                System.out.println("수정할 아이디 >");
                int updateId=sc.nextInt(); > 수정할 아이디를 입력받아 updateId에 저장함
                for(Member mm : list) { > 향상된 for문을 이용하여 list의 정보를 mm에 하나씩 대입함
                    if(updateId == mm.getId()) { > if문을 이용하여 입력받은 아이디와 맞는 정보가 list에 있다면 조건문 실행
                        System.out.println("수정할 이메일입력 >");
                        mm.setEmail(sc.next()); 
                        System.out.println("수정할 비밀번호입력 >");
                        mm.setPw(sc.next());
                        System.out.println("수정할 이름입력 >");
                        mm.setName(sc.next());
                        > 수정한 정보를 해당 어레이 list에 새로 대입함
                        
                        System.out.println("수정 완료!");
                        find = true; > find를 ture로 바꾸며 for문을 빠져나옴
                        break;
                    }
                }
                if(!find) { > 위의 조건에 맞지 않아 find가 계속 false인 경우 실행
                    System.out.println("조회할 수 없는 id입니다"); > "없는id"를 출력함
                }
            } else if (menu == 5) {
                boolean find = false;
                System.out.println("삭제할 id >");
                int deleteId = sc.nextInt();
                for(Member mm : list) {
                    if(deleteId == mm.getId()) {
                        System.out.println(mm.getName()+"님 삭제 완료!");
                        list.remove(mm);
                        find = true;
                        break;
                    }
                }
                if(!find) {
                    System.out.println("조회 할 수 없는 id 입니다");
                }
            } else if (menu == 0) {
                break;
            } else {
                System.out.println("없는 메뉴");
            }
        }
        System.out.println("프로그램 종료");

    }

}

 

  • 숙제_아이디 길이 제한 + 중복된 아이디 걸러주기_내가 생각한 정답
	public void setId(List<User2> list, int max) {
		Scanner sc = new Scanner(System.in);
		while (true) {
			boolean find = false;
			String id = sc.next();
			if (id.length() > max) {
				System.out.print("아이디는" + max + "글자 이상 사용 불가!\n다시입력 >");
				find = true;
			}
			for (User2 u : list) {
				if (u.getId().equals(id)) {
					System.out.println("중복된 아이디입니다\n다시입력 >");
					find = true;
				}
			}
			if (!find) {
				this.id = id;
				break;
			}
		}
	}
    
==============================================================================================

package day8;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class User2_Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		Util2 util2 = new Util2();
		List<User2> list = new ArrayList<>();
		boolean login = false;
		int loginIndex = -1;
		User2 loginUser = new User2();

		while (true) {
			if (login == false) {
				System.out.println("1.회원가입 2.로그인 3.리스트 0.종료");
			} else if (login == true) {
				System.out.println("1.비밀번호 수정 2.로그아웃 3.리스트 4.회원탈퇴 0.종료");
			}
			System.out.println("메뉴 선택>");
			int menu = util2.menuCheck();

			if (menu == 1) {
				if (login == true) {
					System.out.println("비밀번호 확인");
					int pw2 = sc.nextInt();
				} else {
					User2 user2 = new User2();
					System.out.println("이름 입력 >");
					user2.setName(sc.next());
					System.out.println("아이디 입력 >");
					user2.setId(list,4);
					System.out.println("비밀번호 입력 >");
					user2.setPw(sc.next());
					list.add(user2);
					System.out.println("반갑습니다" + user2.getName() + "님 회원가입 완료");
				}
			} else if (menu == 2) {
				if (login == true) {
					login = false;
				} else {
					System.out.println("로그인할 아이디 >");
					String loginId = sc.next();
					System.out.println("로그인할 비밀번호 >");
					String loginPw = sc.next();

					boolean find = false;
					for (User2 mm : list) {
						if (loginId.equals(mm.getId()) && loginPw.equals(mm.getPw())) {
							System.out.println(mm.getName() + "님 로그인 성공!");
							login = true;
							find = true;
							break;
						}
					}
					if (!find) {
						System.out.println("로그인 실패!");
					}
				}
			} else if (menu == 3) {
				if (login == true) {

				} else {
					System.out.println("이름\t아이디\t비밀번호\t가입일");
					System.out.println("------------------------------");
					for (User2 mm : list) {
						mm.print();
					}
				}
			} else if (login == true) {

			} else if (menu == 0) {
				break;
			}
		}
		System.out.println("없는 메뉴 입니다");
	}

}

'나의 수업일지' 카테고리의 다른 글

인천 일보 아카데미 10일차 확장_상속자_오버라이딩 / 추상화  (0) 2023.03.07
인천 일보 아카데미 9일차 static을_알아보자  (0) 2023.03.06
인천 일보 아카데미 7일차 클래스_필드_메소드_오버로딩  (0) 2023.03.02
인천 일보 아카데미 5일차 []배열 알아보기  (0) 2023.02.27
인천 일보 아카데미 (주말 숙제)  (0) 2023.02.27
'나의 수업일지' 카테고리의 다른 글
  • 인천 일보 아카데미 10일차 확장_상속자_오버라이딩 / 추상화
  • 인천 일보 아카데미 9일차 static을_알아보자
  • 인천 일보 아카데미 7일차 클래스_필드_메소드_오버로딩
  • 인천 일보 아카데미 5일차 []배열 알아보기
GUPING
GUPING
안녕하세요 개발자를 꿈꾸는 GUPING 입니다
GUPING
개발자를 꿈꾸는 GUPING
GUPING
전체
오늘
어제
  • 분류 전체보기 (89)
    • 나의 수업일지 (88)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • naver
  • 삭제
  • 파일이름(다중)
  • Ajax
  • PAGE
  • 페이징Controller
  • 버튼2가지이벤트
  • 지식인
  • 파일이름가져오기
  • 업로드파일이름출력
  • 클래스 이름 변경
  • 네이버
  • realative
  • 로그인form
  • 버튼 이벤트 함수 변경
  • 버튼 이벤트 변경
  • 페이징
  • 로그인게시판
  • pagingAjax
  • 틀만들기
  • 파일 이름 가져오기
  • 검색
  • Paging
  • 여러사진프리뷰
  • 개힘드렁
  • 로그인 경고문
  • 검색결과페이징
  • 다중프리뷰
  • 수정
  • 답변 채택

최근 댓글

최근 글

hELLO · Designed By 정상우.
GUPING
인천 일보 아카데미 8일차 메소드로 만들어보기/ArrayList 알아보기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.