Full Stack 교육 회고록

8/22- 자료구조(ArratList),클래스와객체

순두부 호랑이 2022. 8. 22. 13:38
728x90
SMALL

<오전수업- 자료구조>

자료구조의 종류

선형구조: 자료를 구성하는 데이터를 순차적으로 나열시킨 형태

ex) 리스트, 연결리스트, 덱, 스택, 큐

 

비선형구조: 하나의 자료 뒤(안)에 여러개의 자료가 존재할 수 있는것

ex)트리, 그래프

[선형구조]

1.리스트(배열)

- 고정 크기 이상의 객체를 관리할 수 없다

- 배열의 중간에 객체가 삭제되면 응용프로그램에서 자리를 옯겨야 한다

[컬렉션]

collection: 요소(element)라고 불리는 가변 개수의 객체들의 모음

- 객체들의 컨테이너라고도 불림

- 요소의 개수에 따라 collection은 자동 크기 조절

- collection은 요소의 삽입, 삭제에 따른 요소의 이동 자동 관리

list->순서 있음/ set->순서 없이 하나로 뭉쳐 놓음

 

- 고정 크기의 배열을 다루는 어려움 해소

-다양한 객체들의 삽입, 삭제, 검색 등을 관리하기 용이

- 가변 크기로서 객체의 개수를 염려할 필요 없다

-컬렉션 내의 한 객체가 삭제되면 컬렉션이 자동으로 자리를 옮겨준다.

 

[ArrayList<E>의 특성]  <>:generic,E=element자리이다 string이렇게 쓰면 문자열만 들어간다, 내가 원하는 형태를 지정해준다

1. java.util.ArrayList, 가변 크기 배열을 구현한 클래스

   - <E>에서 E대신 요소로 사용할 특정 타입으로 구체화

2. ArrayList에 삽입 가능한 것

   - 객체, null,기본 타입

3. ArrayList에 객체 삽입/삭제

    -  리스트의 맨 뒤에 객체 추가: 공간이 모자라면 자동 늘림

    - 리스트의 중간에 객체 삽입: 삽입된 뒤의 객체는 뒤로 하나씩 이동

    - 임의의 위치에 있는 객체 삭제 가능: 객체 삭제 후 자동 자리 이동

 

(7)-> 초기 길이가 7이다, ()은 비워 두어도 된다

ex) new ArratList<int>();

 

 

중간에 비워놓고 뒤에 채우는건 불가능하다(null값을 넣는건 가능하다)= a.size()보다 큰 위치에 삽입 불가능

package 어레이리스트;

import java.util.ArrayList;

public class Ex01arraylist생성 {

	public static void main(String[] args) {
		
		//1.ArrayList 생성
		//                                          ()소괄호 안에 크기지정 할 수 있다(기본값:10)
		ArrayList<String> al = new ArrayList<String>();
		
		//2. 요소 삽입
		//2-1. 맨마지막 자리에 삽입
		al.add("python"); //0번 인덱스
		al.add("java");  // 1번 인덱스
		al.add("javascript"); //2번 인덱스
		
		//2-2. 특정 자리에 삽입(인데스 번호(int), 삽입할 데이터)
		al.add(1,"c++");
		
		//3. 요소 개수
		int n = al.size();
		System.out.println(n);
		
		//4. 특정 위치의 요소 알아내기
		System.out.println(al.get(1));
		for(String s:al) {
			System.out.println(s);
		}
		
		//5.요소 삭제
		//5-1. 특정 인덱스에 요소 삭제
		al.remove(2);
		
		//5-2. 전체 삭제
		al.clear();
		
		for(String s:al) {
			System.out.println(s);
		}
		
	
	}

}

package Aug_seventeenth_reviw;

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

public class ex12 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		ArrayList<String> musicList = new ArrayList<>();

		while(true) {
			System.out.print("[1]노래 추가 [2]노래 삭제 [3]종료 >> ");
			int menu = sc.nextInt();

			if(menu==1) {//노래추가
				//현재 재생목록 출력
				System.out.println("===MusicList===");
				//isEmpty() -> boolean(값이 없으면 true 있으면 false)
				if(musicList.isEmpty()) {//재생목록이 비어있으면
					System.out.println("재생목록이 없습니다");
				}else { //재생목록이 비어있지 않으면
					int n =1;
					for(String s:musicList) {
						System.out.println(n++ + "." + s);
					}
				}
				System.out.println("================");
				System.out.print("[1]마지막 위치 추가 [2]원하는 위치에 추가 >>");
				int choice = sc.nextInt();
				if(choice==1) {
					System.out.print("추가할 노래 입력: ");
					sc.nextLine();
					String name = sc.nextLine();
					musicList.add(name);
					
					//musicList.add(sc.next());					
				}else {//2
					System.out.println("추가할 노래 입력 : ");
					sc.nextLine();
					String name = sc.nextLine();
					System.out.println("추가할 위치 입력 : ");
					int index = sc.nextInt();
					//재생목록 1~
					//arraylist 0~
					musicList.add(index,name);
				}
				System.out.println("추가가 완료되었습니다!");
			}else if(menu==2) {//노래 삭제
				boolean listEmpty = musicList.isEmpty();
				//현재 재생목록 출력
				System.out.println("===현재재생목록===");
				//isEmpty() -> boolean(값이 없으면 true 있으면 false)
				if(musicList.isEmpty()) {//재생목록이 비어있으면
					System.out.println("재생목록이 없습니다");
				}else { //재생목록이 비어있지 않으면
					int n =1;
					for(String s:musicList) {
						System.out.println(n++ + "." + s);
					}
				}
				System.out.println("================");
				
				if(!listEmpty) {//비어있지 않으면 삭제기능
					System.out.print("[1]선택삭제 [2]전체삭제 >> ");
					int choice = sc.nextInt();
					if(choice==1) {
						System.out.print("삭제할 노래 선택 : ");
						int delM = sc.nextInt();
						musicList.remove(delM-1);
					}else {//2
						musicList.clear();
					}
					System.out.println("노래가 삭제되었습니다");
				}
				
				
			}else { //3 -> 종료
				System.out.println("프로그램이 종료되었습니다.");
				break;
			}
		}
	}

	//musiclist 출력 문구
	public static boolean prontList(ArrayList<String> al) {
		
		//musiclist 비어있는지 비어있지 않은지
		boolean isEmptyList=false;
		
		//현재 재생목록 출력
		System.out.println("===현재재생목록===");
		//isEmpty() -> boolean(값이 없으면 true 있으면 false)
		if(al.isEmpty()) {//재생목록이 비어있으면
			System.out.println("재생목록이 없습니다");
			isEmptyList = true; //비어있다
		}else { //재생목록이 비어있지 않으면
			int n =1;
			for(String s:al) {
				System.out.println(n++ + "." + s);
			}
			isEmptyList=false;//비어있지 않다
		}
		System.out.println("================");
		
		return isEmptyList;
	}
	
}

[선형구조]

2.스택

가장 마지막이 먼저 나와야되면 스택을 쓴다

 

[스택(stack)]

스택 데이터를 일시적으로 쌓아 놓는 자료구조

가장 나중에 넣은 데이터를 가장 먼저 꺼냄 -> 후입선출(LIFO:Last in First out)

자바 프로그램에서 메서드를 호출하고 실행할 때 내부에서 사용

푸시(push)와 팝(pop)을 통해 데이터를 사용

스택: 자바 프로그램에서 메서드를 호출하고 실행할 때 내부에서 사용

Q. 순서가 A,B,C,D로 정해진 입력 자료를 스택에 입력하였다가 출력한 결과로 가능한 것이 아닌 것은? 4번

1: D,C,B,A

2: B,C,D,A

3: C,B,A,D

4: D,B,C,A

Peek ->꺼내지 않고 확인만 하는것

package 스택;

import java.util.Stack;

public class Ex01스택생성 {

	public static void main(String[] args) {
		
		//1. 스택생성
		Stack<String>st = new Stack<>();
		
		//boolean, int -> reference type 이 아님!
		// <> : primitive Tyoe ->Reference Type
		//정수형?
		//int ->Integer
		//char -> Character
		//"123" => 123(String -> int)
		//Integer.parseInt("123");
		Stack<Character>st1 = new Stack<>();
		
		//2. 요소 삽입 (push)
		st.push("apple");
		st.push("banana");
		st.push("kiwi");
		st.push("peach");
		
		
		//3. 가장 위(top)에 있는 데이터 확인
		String s = st.peek();
		System.out.println(s);
		
		//4. 가장 위(top)에 있는 데이터 삭제(꺼내기)
		String s1 = st.pop();
		System.out.println(s1);
		
		System.out.println(st.peek());
		
		//5. 요소 조회(search)
		//특정 데이터가 몇번째에 존재하는지 -> 정수형    스택은 0이 아니라1부터 시작한다  위에서 부터가1번이다
		int n = st.search("banana");
		System.out.println(n); 
		
		//6. 스택이 비어있는지 확인(empty)
		//비어있으면 true 비어있지 않으면 false
		System.out.println(st.empty());
		
		//스택이 빌때까지 요소를 꺼내기
		while(!st.empty()) {//스택이 비어있지 않으면
			//요소를 꺼내기
			System.out.println(st.pop());
		}
		
		
	}

}

<오후수업>

package Ex04;

public class Person {
	
	//필드
	//public:내부/외부 어디서든 접근할 수 있는 지정자
	//private: 같은 클래스 내에서만 접근이 가능한 지정자
	//default(생략가능) : 같은 패키지 안에서 접근이 가능한 지정자
	//protected : 같은 패키지 안에서 접근이 가능한 지정자
	//            (상속의 경우 다른 패키지더라도 접근이 가능하다)
	private String name;
	private int age;
	
	//기본 생성자 메소드
	public Person() {
		
	}
	
	//생성자 메소드 -> 메소드 오버로딩(중복정의)
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
}
package Ex04;

public class PersonMain {

	public static void main(String[] args) {
		
		//1.Person의 default 생성자를 사용하여 객체 생성
        Person person1 = new Person();
        
        //2.person1에 이름과 나이 초기화
		person1.setName ("홍길동");
		person1.setAge(27);
		
		//3.2개의 매개변수를 넘겨받아 새로운 개체 person2생성
		Person person2 = new Person("홍길순",20);
		
		
		//4. 출력
		System.out.println("person1의 이름 : "+ person1.getName() + "," + "나이: " + person1.getAge() );
		System.out.println("person2의 이름 : "+ person2.getName() + "," + "나이: " + person2.getAge() );
	}

}

 

package ex_static;

public class A {

	public static void main(String[] args) {
		// static(정적)/ Heap
		
		test01();
		
		A a = new A();
		a.test02();
		
		B b = new B();
		b.test03();
		B.test03();
		b.test04();
		//

	}
	
	public static void test01() {
		System.out.println("static이 있는 test01 메소드");
	}
	
	public void test02() {
		System.out.println("static이 없는 test02 메소드");
	}
	
	

}
package ex_static;

public class B {
	
	public static void test03() {
		System.out.println("static이 있는 test03 메소드");
	}
	
	public void test04() {
		System.out.println("static이 없는 test04 메소드");
	}

}
package Ex05;

public class Pocketmon {
	
	// 1. 이름(String), 속성(String), 레벨(int), 체력(hp), 공격력(int) -> 포켓몬의 속성(데이터)
	// - 외부에서 접근하지 못하도록 private 지정
	private String name;
	private String type;
	private int lv;
	private int hp;
	private int attack;
		
	// 2. 5개의 매개변수를 받을 수 있는 생성자 메소드 만들기
	// 생성자 메소드 특징
	// 1. 반환 타입 X-> void X
	// 2. 메소드의이름은 클래스 명과 동일하다
	// 3. 생성자 메소드는 오버로딩이 가능하다
	// 4. 객체 생성시 new 키워드와 함께 호출된다!
	
	//메소드 생성 단축키 : alt +shift+s -> 생성자 및 getter/setter 생성가능!
	public Pocketmon(String name, String type, int lv, int hp, int attack) {
		this.name = name;
		this.type = type;
		this.lv = lv;
		this.hp= hp;
		this.attack= attack;
	}
			
	
	
	// 3. 공격하기 attack()-> 포켓몬의 기능
	// - 리턴 타입 X
	// - 메소드 호출시 "공격하기!" 출력
	public void attack() {
		System.out.println("공격하기!");
	}

	public String getName() {
		return name;
	}

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

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public int getLv() {
		return lv;
	}

	public void setLv(int lv) {
		this.lv = lv;
	}

	public int getHp() {
		return hp;
	}

	public void setHp(int hp) {
		this.hp = hp;
	}

	public int getAttack() {
		return attack;
	}

	public void setAttack(int attack) {
		this.attack = attack;
	}

	// getter/setter (): 외부로 부터 접근이 가능하고 내부적인 필드에 접근할 수 있는 기능
	// getter(): 데이터를 확인하는 용도!
	// setter() : 데이터를 저장/수정 용도!
	
	
	
	
	
	
	
}
package Ex05;

import java.util.ArrayList;

public class pocketMain {

	public static void main(String[] args) {
		
		Pocketmon mon1= new Pocketmon("피카츄","전기",10,80,120);
		
		//mon1.type = "물"; 
		
		// 내가 원하는 포켓몬 추가하기
		// mon2, mon3
		Pocketmon mon2= new Pocketmon("치코리타","풀",10,100,90);
		Pocketmon mon3= new Pocketmon("파이리","불",10,100,90);
		
		//배열(Array) : 같은 데이터 타입을 관리하기 위하여 사용하는 기능
		Pocketmon[] mons = new Pocketmon[3];
		
		mons[0]= mon1;
		mons[1]= mon2;
		mons[2]= mon3;
		
		//Pocketmon 가방에서 치코리타 꺼내오기

//		System.out.println(mons[0].getName());
//		System.out.println(mons[1].getName());
//		System.out.println(mons[2].getName());
//		
//		
//		for(int i=0; i< mons.length; i++) {
//			System.out.println(mons[i].getName());
//			System.out.println(mons[i].getType());
//		}
		
		// 가변배열 (ArrayList): 크기가 상관없이 계속해서 늘어날 수 있는 배열
		// 1.Pocketmon 타입의 배열의 이름이 pocketList인 가변배열 생성하기
		ArrayList<Pocketmon> pocketList = new ArrayList<>();
						
		// 2. 생성된 가방에 mon1,mon2,mon3 순서대로 담아주기
		pocketList.add(mon1); // 피카츄에 대한 내용
		pocketList.add(mon2); // 치코리타에 대한 내용
		pocketList.add(mon3); // 파이리에 대한 내용
		
		//포켓몬 생성과 동시에 가변배열에 추가하는 방법!
		pocketList.add(new Pocketmon("꼬부기","물",20,90,130));
		
		//3. 가변배열에 들어있는 포켓몬들의 이름과 타입, lv 출력하기!
		for(int i =0; i< pocketList.size(); i++) {
		System.out.println((i+1)+". "+pocketList.get(i).getName()+","+pocketList.get(i).getType()+","+	pocketList.get(i).getLv());
		}
	
		
	}

}
package Ex05;

import java.util.ArrayList;

public class Ex_ArrayList {

	public static void main(String[] args) {
		
		// 가변 리스트 선언하기 -> import 작업 필요!
		// <> -> 제네릭 타입 : 클래스 구조(레퍼런스)로 되어있는 데이터 타입을 지정 해야 한다
		ArrayList<Integer> list = new ArrayList<>();
		
		// 데이터 저장 -> add(데이터 값), add(위치, 데이터 값)
		// 배열명 [위치] = 데이터 값;
		
		System.out.println(list.size());
		
		list.add(1);
		System.out.println(list.size());
		
		list.add(3);
		System.out.println(list.size());
		
		//추가시 가장 마지막 위치에 데이터 추가!
		
		//데이터 확인하기(가져오기) -> get(위치)
		System.out.println(list.get(0));
		System.out.println(list.get(1));
		
		list.add(7);
		System.out.println(list.get(0));
		System.out.println(list.get(1));
		System.out.println(list.get(2));
		
		//데이터 삭제 -> remove(위치)
		list.remove(1);
		
		System.out.println(list.get(0));
		System.out.println(list.get(1));
		//System.out.println(list.get(2));
		
		//데이터 수정 -> set(수정의 위치, 수정할 데이터 값)
		list.set(0, 9);
		System.out.println(list.get(0));
		System.out.println(list.get(1));

	}

}
package Ex05;

import java.util.ArrayList;

public class Ex_ArrayList2 {

	public static void main(String[] args) {
		
		//String형의 ArratList 생성
		ArrayList<String> names = new ArrayList<>();
		
		names.add("홍길동");
		names.add("홍원길");
		
		names.add(1,"홍두길");
		
		System.out.println(names.get(0));
		System.out.println(names.get(1));
		System.out.println(names.get(2));
		

	}

}
728x90
LIST