배열, ArrayList, 접근제한자,정보은닉, 캡슐화,패키지
//일반배열
public class Exam_01 {
	public static void main(String[] args) {
		String[] str = new String[10]; //사이즈를 지정해줘야한다
		str[0]="Hello"; //배열의 몇번에 저장한다고 지정해줘야한다
		str[1]="world";
		str[2]="Java";
		//str[3]=300; 자료형이 달라서 숫자를 넣으면 오류가 난다.
		System.out.println(str[1]);
		
		str[1]=str[2]; //삭제하기
		str[2]=null;
		
		System.out.println(str[1]);
		
		str[2]=str[1]; //끼워넣기
		str[1]="world";
		
		//지금은 배열의 데이터가 적어서 코드가 2줄이지만, 데이터가 많아지면 코드도 더 길어진다.
		System.out.println(str[1]);
		System.out.println(str[2]);
	}
}

import java.util.ArrayList;
//동적배열 = 움직이는 배열 = vector=Arraylist
public class Exam_02 {
	public static void main(String[] args) {
		//ArrayList str = new ArrayList(); //ArrList의 특성으로 사이즈가 중요하지않다. 사이즈를 스스로 자동으로 확장해줌. 데이터를 많이 넣어도 상관이 없다.
		//ArrayList는 배열인데 내가 자료형을 안정해는데 이 것은 무엇?
		//String형을 받으면서도 int형도 받을 수 있다 = 다형성을 가지고 있다.
		//ArrayList를 옛날에 최초에 만들었던 사람이 이후 사용하는 사람들이 무슨값을 넣을지 몰라서 뭐든지 넣을 수 있는 배열을 만든 것임.
		//ArrayList를 뜯어보면 배열이 있고, 그 배열의 자료형은 Object이 된다.
		//Object는 원전 클래스의 인스턴스? 이기 때문에 어느 자료형이나 다 들어갈 수 있다.
		//결론 : ArrayList는 Object형 배열이다.
		//장점 : 어떤 것을 넣어도 좋다. 
		//단점 : 꺼내서 쓰려면 다운캐스팅을 해야한다.(왜? Object형에 Scanner형을 저장한 것을 꺼낼 때 해당 주소의 Object 인스턴스만 인식하기 때문에 (Scanner)Object 식으로 다운캐스팅을 매번 해줘야 해서 불편하다.
		
		ArrayList<String> str = new ArrayList<String>();
		// 자바 1.5버젼에서 나온 해결책
		// <> Generic문법 : <> 통해서 자료형을 넣으면, 배열의 자료형이 바뀐다.
		// 다형성을 잃었지만, 편의성을 얻음(다운캐스팅을 하지 않아도 됨).
		// 다형성이 항상 꼭 좋은게 아님. 필요할 때 사용하면 됨.
		
		str.add("Hello"); //ArrayList클래스의 add메서드를 이용해서 자동으로 땡김?순서상 0번일 수 밖에 없음.  =0번에 저장하겠다, 1번에 저장하겠다 라는 말이 필요 없다
		str.add("world");
		//str.add(100); // 숫자가 오류가 나지 않고 값이 저장된다.
		str.add("Java");
		//System.out.println(str.get(1));//ArrayList클래스의 get메서드를 이용해서 0번을 가져옴ㄴ
		
		//str.remove(1); //1번 인덱스의 값 지워라 하면 자동 지워짐&뒤의 값들이 앞으로 땡겨옴 
		//System.out.println(str.get(1));
		
		//str.add(1, "world"); // add할때 인덱스번호를 함께 입력하면, 거기에 끼워넣어짐
		//편하게, 손쉽게 데이터를 넣고 삭제할 수 있다.
		
		((String)str.get(1)).length();//그냥 str.get(1).을 찍으면 object형의 메소드만 보이지 String의 메소드는 보이지 않는다. String형으로 다운캐스팅을 해줘야만 보인다.
		
		str.size(); //ArrayList에 데이터가 몇개 들어있는지 알려주는 메소드
		
		//ArrayList에 있는 데이터 모두 출력하기
		for(int i =0;i<str.size();i++) {
			System.out.println(str.get(i));
		}
		
		//컬렉션이란? 변수가 하나 이상 뭉쳐있는 구조(배열,리스트,트리)		
		//foreach 문
		//for(컬렉션의 자료형 하나하나 꺼냈을 때 받아줄 수 있는 변수:컬렉션)
		//str의 0번부터 하나씩 tmp에 저장되서 실행됨
		for(String tmp : str) {
			System.out.println(tmp);
		}
		//변수 활용이 좀 떨어짐(반복하는 순서 숫자값 활용 등...)
		//전체를 출력하고자 할때는 foreach문이 적절함
		
		ArrayList<Integer> num = new ArrayList<>();
		
		for(int i =1;i<50;i++) {
			num.add(i);
		}
		
		for(int i =1;i<50;i++) {
			num.add(i);
		}
		
		for(int tmp : num) {
			System.out.print(tmp + " ");
		}
		
		
		
	}
}

public class Exam_03 {
//public > protected > package > private (접근범위순)

//public : 어디서나접근가능
//protected : 같은 패키지 내에 있는 애들끼리만 볼 수 있음(다른 패키지에서 접근 X). 서로 다른 패키지에 있는 상황인데 다른 패키지쪽에서 이 클래스를 상속을 받았으면(extends) 접근할 수 있음. (패키지보다 약간 더 넓다)
//package : 디폴트 접근제한자. 같은 패키지 안에 있는 클래스는 자유롭게 사용 가능하다.(다른 패키지에서는 프라이빗처럼 취급됨) 
//private : 선언한 클래스 내부에서만 사용가능.

	
//일반적으로는 public이랑 private만 주로 쓰고, protected나 package는 잘 안씀.
	
//protected는 '너가 오버라이딩하는게 좋을걸?'하는 의미로, 너가 수정하는게 좋을거야하고 추천하는 의미로 쓰기도 함.
//protected는 package와 같이 같은 패키지 내에서만 볼 수 있으나 상속으로 볼 수 있는 범위가 더 넓어짐

//정보은닉을 하는 이유?
//이 개발자의 의도에서 벗어나지 않게 사용하지 않도록
//사용자가 볼 필요 없는 것들을 보여주지 않게 하기 위해서
	
//캡슐화
//클래스 사용자가 알필요 없는 내용들은 감추고, 반드시 사용해야하는 내용만 외부로 노출하는 방식의 클래스 설계이론

	
//패키지(package)란?
//(이클립스에서 패키지를 만들던, 폴더를 만들던 패키지가 만들어짐?)
//분류하는 역할을 가짐. 평범한 폴더에 불과하다.
//패키지 이름을 만들때 관습(컨벤션이 있다.)
//소문자로 쭉 만들면 되는데, 레벨 단위로 3단계를 나누어 쓴다
//내가 속하는 가장큰 집단-고레벨(회사명,학원명).그 안의 어떤 팀인지(소속인지,혹은 프로젝트이름).분류
//tt.student.exam
//패키지는 .단위로 하위폴더를 만든다(자동으로 레벨을 나눠줌)
//폴더는 단순히 걍 폴더 하나를 만듬.
//클래스를 레벨단위로 관리하기 위해서
	
//	public static void main(String[] args) {
//		Tv tv = new TV();
//		tv.
//	}
}