Object 클래스 // 오브젝트는 최상위 부모 클래스다 클래스의 아담
3. hachCode()
JVM에서 관리하는 중복 없는 값. 실제 메모리에 할당되는 주소와 다르다.
String 클래스에서는 필드의 해시코드 값이 아닌 문자열 상수값의 해시코드를 리턴하도록 재정의하였다.
※컬렉션 프레임워크 챕터에서 재정의 목적을 이해하도록 한다.
package objectTest;
//hashcode
import java.util.Random;
public class HashCodeTest {
public static void main(String[] args) {
String data1 = "ABC";
String data2 = new String("ABC");
System.out.println(data1.hashCode()); //64578
System.out.println(data2.hashCode()); //64578
//hashCode는 메모리 예약된 주소라서 중복 x
//주소값이 동일하게 나왔다는건 필드의 주소가 아니라 값의 시작주소 값
//Object에 원래 소속되어있는 hashcode를 String 클래스에서 재정의한것
//equals비교해서 true면 두개의 hashcode도 같아야함
//값은 같지만 hash코드 자료구조에서 두객체가 다르다고하면 모순이 생김
Random random = new Random();
System.out.println(random); //해쉬코드값:java.util.Random@5d22bbb7
System.out.println(random.hashCode());//1562557367
// string 클래스에서는 문자열 상수값의 해시코드를 리턴하도록 재정의 되어있다.
}
}
Wrapper Class: 기본 자료형들의 클래스 타입(int 등)
클래스타입 객체 = new 클래스타입(일반타입의 값); //boxing, 권장하지 않는다(Deprecated).
클래스 타입 객체 = 클래스타입.valueOf(일반타입의 값); //boxing
일반타입 변수 = 객체.000Value(); //unboxing
JDK4버전 이상부터는 auto boxing,unboxing을 지원한다.
클래스타입 객체 = 일반타입의 값; // auto boxing
일반타입 변수 = 객체; //auto unboxing
package wrapper;
public class WrapperTest {
public static void main(String[] args) {
int data_i=10;//업캐스팅 x 내부api 사용 x
// auto boxing
Integer data_I = data_i;
// auto unboxing
data_i = data_I;
// Integer data_I= new Integer(data_i);//밑줄은 쓰지말라는 뜻
// boxing
// Integer data_I= Integer.valueOf(data_i);
//boxing을 하면장점
//1.Integer 클래스안에 메소드들을 사용가능
//2.업캐스팅 가능해진다
// System.out.println(data_I);
//
// unboxing
// data_i = data_I.intValue();//boxing 햇던걸 다시 int 타입으로
}
}
알고리즘
어떤 문제가 발생되었을 때 해결할 수 있는 절차 혹은 순서.
자료구조 (저장소)
의미없는 데이터를 하나의 정보로 만들어주는 알고리즘들의 집합.
담기만 하면 자료구조
수집한 자료를 저장하는 방법.
변수,배열 포함
★컬렉션 프레임워크(Collection Framework)
많은 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스들의 집합.
1. List extends Collection
-Vector: 용량관리, 보안성 강화, 처리량 감소 // 구시대 유물 -> 보안성강화를 위해 성능 다운
-LinkedList: FILO로 인해 넣을 때는 빨라도 원하는 위치의 데이터를 가져오는 것이 상대적으로 느리다. //실무에 잘 안쓴다
-*ArrayList: 인덱스로 데이터를 관리한다. 컬렉션 클래스 중 실무에서 가장 많이 사용되는 클래스이다.
배열의 특징인 인덱스를 이용하여 값을 저장하고 관리한다.
※배열과 ArrayList의 차이
배열은 길이에 제한을 두어야 할 때 자주 사용되고,
ArrayList는 몇개의 데이터가 들어올 지 알 수 없을 때 사용한다.
몇개의 값을 넣을지 모를때 주소 사용
package arrayListTest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Vector;
public class ArrayListTest{//<T extends Number>
public static void main(String[] args) {
// <?>: 제네릭(이름이 없는)
// 객체화 시 타입을 지정하는 기법
// 설계할 때에는 타입을 지정할 수 없기 때문에 임시로 타입을 선언할 때 사용한다.
// 따로 다운 캐스팅할 필요가 없으며, 지정할 타입에 제한을 줄 수 있기 때문에 Object가 아닌 제네릭으로 선언한다.
// ArrayListTest<String> arrayListTest = new ArrayListTest<String>();//Number이라는 클래스를 extends 했을경우 String이 포함되지않아 사용 불가
// ArrayListTest<Double> arrayListTest = new ArrayListTest<Double>();//Number이라는 클래스를 extends 했을경우 사용 가능
// capacity(용량): 미리 확보해 놓을 공간, 나의 메모리의 한계를 확인할 수 있다.
// 용량에 제한을 주는 것이 아니다!
ArrayList<Integer> datas = new ArrayList<>();
//배열에 데이터를 하나하나 넣어줌
datas.add(40);
System.out.println(datas.size());
datas.add(50);
System.out.println(datas.size());
datas.add(90);
datas.add(60);
datas.add(70);
datas.add(10);
datas.add(80);
datas.add(20);
datas.add(30);
datas.add(100);
System.out.println(datas.size());
System.out.println(datas);
System.out.println("============");
// 정렬
Collections.sort(datas);//Collections에 API알고리즘이 이것저것들어가있음
//ToString이 재정의 되어있어서 가능
//주소값이 void, 다른영역 값들이 바뀌기때문에 지속됨
System.out.println("오름차순");
System.out.println(datas);
Collections.reverse(datas); // 오름차순 정렬이후 가능
System.out.println("내림차순");
System.out.println(datas);
Collections.shuffle(datas);
System.out.println("랜덤 셔플");
System.out.println(datas);
// 추가(삽입) 60은 항상 30뒤에 삽입된다.
if(datas.contains(30)) {//contains는 특정문자가 있는지 확인하는 함수
datas.add(datas.indexOf(30) + 1, 60);//indexOf(30)자리에서 +1한곳에 60삽입
}
System.out.println(datas);
// 수정 10을 1로 수정한다.
if(datas.contains(10)) {
System.out.println(datas.set(datas.indexOf(10), 1) + "이 1로 수정");
//set으로 index(10)의 자리를 1로 수정
System.out.println(datas);
}
// 삭제(값으로 삭제) 20을 삭제한다.
if(datas.remove(Integer.valueOf(20))) {//datas(20)값을 찾아서 삭제
System.out.println("삭제 성공"); //boxing => 값으로 삭제하려면 Object로 호출
System.out.println(datas); //20은 int index지우는게됨
} //int 가아니라 Object의 자식
// 삭제(인덱스로 삭제) 50을 삭제한다.
if(datas.contains(50)) {//
System.out.println(datas.remove(datas.indexOf(50)) + "삭제");//삭제된 것을 리턴
System.out.println(datas);// 50이 빠진 배열
}
}
private static Object datas(int i) {
// TODO Auto-generated method stub
return null;
}
}
[심화실습]
User 클래스 선언
-이름, 아이디, 비밀번호, 휴대폰번호
-private 접근자 사용
-기본 생성자 선언
-초기화 생성자는 사용하지 않는다(art+shift+s,o)
-toString() 재정의
DBConnecter 클래스 선언
-회원 정보를 담을 DB를 ArrayList로 선언
UserField 클래스 선언
-아이디 중복검사
-회원가입
-로그인
-암호화
-비밀번호 변경(마이페이지)
-인증번호 전송(API)
package arrayLlistTask;
import java.util.ArrayList;
import arrayListTask.Fruit.Fruit;
import arrayListTask.user.User;
import arrayLlistTask.Food.Food;
import arrayLlistTask.love.Love;
//회원 정보를 담을 DB를 ArrayList로 선언
public class DBConnecter {
public static ArrayList<User> users = new ArrayList<User>();//1
public static ArrayList<Food> foods = new ArrayList<Food>();
public static ArrayList<Fruit> fruits = new ArrayList<Fruit>();
public static ArrayList<Love> loves = new ArrayList<Love>();
//Db를 연결하는 코드
//Db에서 사용하는 순간 가져옴
}
package arrayListTask.user;
public class User {
// 이름, 아이디, 비밀번호, 휴대폰번호
private String password;
private String name;
private String id;
private String phoneNumber;
public User() {;} // 기본 생성자
//getter,setter
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
//ToString
@Override
public String toString() {
return "User [name=" + name + ", id=" + id + ", password=" + password + ", phoneNumber=" + phoneNumber + "]";
}
}
package arrayListTask.user;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Random;
import arrayLlistTask.DBConnecter;
public class UserField {
public ArrayList<User> users = DBConnecter.users;//4
//DBC 에서 연결,연결된것은 arraylist에서 사용
public static String userId;
private final int CERTIFICATED_NUMBER_LENGTH = 6;
// - 아이디 중복검사
public User checkId(String id) {//2
User user = null;
for (User temp : users) { //3 User temp(변수명) :users(
if(temp.getId().equals(id)) {//4 여러명의 유저를 중복검사 할것
// getid와 중복이 있을경우
user = temp;
break;
}
}
// 중복 없을시 user 반환
return user;
}
// - 회원가입
public void join(User user) {
user.setPassword(encrypt(user.getPassword()));
users.add(user);
}
// - 로그인
public boolean login(String id, String password) {
User user = checkId(id);
if(user != null) {
if(user.getPassword().equals(encrypt(password))) {
userId = user.getId();
return true;
}
}
return false;
}
// - 로그아웃
public void logout() {
userId = null;
}
// - 암호화
public String encrypt(String password) {
return new String(Base64.getEncoder().encode(password.getBytes()));
}
// - 복호화
public String decrypt(String encryptedPassword) {
return new String(Base64.getDecoder().decode(encryptedPassword.getBytes()));
}
// - 비밀번호 변경(마이 페이지)
public void update(User user) {
User userInDB = checkId(userId);
users.set(users.indexOf(userInDB), user);
}
// 회원 정보 조회
public User select() {
for(User user : users) {
if(user.getId().equals(userId)) {
return user;
}
}
return null;
}
// - 인증번호 전송(API)
public String sendMessage(String phoneNumber) {
Random random = new Random();
String certificatedNumber = "";
for (int i = 0; i < CERTIFICATED_NUMBER_LENGTH; i++) {
certificatedNumber += random.nextInt(10);
}
// 인증번호는 문자 API에서 보낼 텍스트에 작성하면 된다.
return certificatedNumber;
}
}
package arrayListTask.user;
//동작 test 클래스
import java.util.ArrayList;
import arrayLlistTask.DBConnecter;
public class Test {
public static void main(String[] args) {
UserField userField = new UserField();
User user = new User();
// 로그인
user.setId("STS1234");
user.setName("송태섭");
user.setPassword("1234");
user.setPhoneNumber("01012341234");
if(userField.checkId(user.getId()) == null) {
userField.join(user);
System.out.println(DBConnecter.users);
}else {
System.out.println("사용할 수 없는 아이디입니다.");
}
//
// if(userField.login("hds1234", "1234")) {
// System.out.println(UserField.userId);
//
// }else {
// System.out.println("아이디 또는 비밀번호를 다시 확인해주세요.");
// }
// 로그아웃
// userField.logout();
//
// System.out.println(UserField.userId);
// 마이페이지
// user = userField.select();
// user.setPassword(userField.encrypt("9999"));
// userField.update(user);
//
// for (User temp : DBConnecter.users) {
// System.out.println(userField.decrypt(temp.getPassword()));
// }
// System.out.println(userField.sendMessage("01055559999"));
// 회원가입 및 아이디 검사
// user.setId("hds1234");
// user.setName("한동석");
// user.setPassword("1234");
// user.setPhoneNumber("01012341234");
//
// if(userField.checkId(user.getId()) == null) {
// userField.join(user);
// System.out.println(DBConnecter.users);
// }else {
// System.out.println("사용할 수 없는 아이디입니다.");
// }
//
// user = new User();
// user.setId("lss1234");
// user.setPassword("dltnstls1234");
//
// if(userField.checkId(user.getId()) == null) {
// userField.join(user);
// System.out.println(DBConnecter.users);
// }else {
// System.out.println("사용할 수 없는 아이디입니다.");
// }
}
}
'웹개발 수업 > JAVA' 카테고리의 다른 글
웹개발_JAVA 18 (2) | 2023.02.15 |
---|---|
웹개발_JAVA 17 (0) | 2023.02.14 |
웹개발_JAVA 15 (0) | 2023.02.08 |
웹개발_JAVA 14 (0) | 2023.02.07 |
웹개발_JAVA 13 (0) | 2023.02.06 |
댓글