8/22- 자료구조(ArratList),클래스와객체
<오전수업- 자료구조>
자료구조의 종류
선형구조: 자료를 구성하는 데이터를 순차적으로 나열시킨 형태
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));
}
}