JAVA/Java: 149개의 글
Java는 C언어처럼 포인터가 없어 메모리의 주소와 해당 값을 함께 볼 수 없는 단점이 너무 너무 너무~ 크다 ! Java 문서나 많은 글을 읽어도 메모리의 구조가 어떻게 어떤 흐름으로 돌아가는 지 내가 알고 있는 이 답이 확실한가에 대한 의문도 많이 든다. StringBuffer의 append 메소드를 사용할 때, 어떤 식으로 값이 메모리에 할당되고 흘러가는 지 내가 이해한 바를 정리하고자 한다. StringBuffer sb = nes StringBuffer(); sb.append("a"); sb.append("b"); 단순 참조를 위한 문자열은 String 클래스, 연산이 많은 경우는 가변적으로 문자열을 저장하고 관리하는 StringBuffer 클래스를 사용한다. 위 코드와 같은 경우, 다음과 같은 ..
차이점 String 과 StringBuffer(StringBuilder), 두 클래스 모두 문자열을 담고 연산하는 것인데 차이가 뭐지? 성능이 어떻게 다르지? 궁금했던 분들에게 그 차이점을 스윽 정리해드리고자 한다! 아래 표를 보면 된다 ! String StringBuffer StringBuilder 문자열을 저장하고 관리하는 클래스 immutable (불변) mutable (가변) new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다. 문자열 연산을 했을 때, 메모리 공간이 변하는 것이 아닌 새로운 String 객체를 만드는 것이다. 문자열 연산에 있어서 new로 객체 생성을 한번 한 후, 연산이 필요할 때 크기를 변경시켜 문자열을 변경한다 동기화(Synchronized)를 지원..
String 문자열 생성 방식 String str1 = new String("Hello"); String str2 = "Hello"; String str3 = "Hello"; 1. new 이용한 문자열 생성 2. 문자열 리터럴 생성 두 방식의 차이점 두 방식의 가장 큰 차이점은 메모리 영역에 있다. new 연산자를 통해 String을 생성하면 Heap 영역에 존재하게 되고, 리터럴을 이용할 경우 string constant pool이라는 영역에 존재하게 된다. (아래 그림 참고) 똑같은 "Hello" 문자열을 사용하는 데 변수 str2 와 str3은 같은 객체를 바라보지만 new String으로 생성한 str1은 다른 메모리 주소의 객체를 바라보는 것이다. 문자열을 비교해보면, String str1 = ..
추상 클래스내 함수 구현 처럼 Interface 클래스 내에 함수를 선언 및 구현할 수 있도록 한다. Interface 구현 클래스에서 Override 할 수 있다. 왜? 나왔을까? "하위 호환성" 때문에 등장 인터페이스에 신규 함수 선언시 기존에 상속받아 구현하던 클래스에 모두 빨간불이 들어와 직접 구현을해야하는 상황을 방지하기 위해 등장함. 간단 코드로 보기 public class DefaultClass{ public interface TestInterface { // 선언 후 구현까지 해야한다. default void defaultFunction(){ System.out.println("this is default function"); } } private static class SubClass11..
/** * 이메일 masking 후 리턴 * 변환 실패시 입력값 그대로 리턴 * 이메일 아이디 앞 2자리 노출 * 마스킹 처리는 글자수 상관없이 5자리로 노출 * */ public String maskingEmail(String email){ try{ if(StringUtils.isEmpty(email) || !email.contains("@")){ return email; } String[] emailSplited = email.split("@"); if(emailSplited.length != 2){ return email; } if(emailSplited[0].length()
/** * 핸드폰번호 masking 후 리턴 * 변환 실패시 입력값 그대로 리턴 * */ public String maskingPhoneNumber(String phoneNumber){ try{ if(StringUtils.isEmpty(phoneNumber)){ return phoneNumber; } phoneNumber = phoneNumber.replaceAll("[^0-9]",""); // 숫자만 추출 if(!(phoneNumber.length() == 10 || phoneNumber.length() == 11)){ return phoneNumber; } if(phoneNumber.length() == 10){ // 10자리인 경우. 000-***-0000로 지환 return phoneNumber...
public static String toOnlyNumStr(String str){ return str.replaceAll("[^0-9]",""); } 출처: https://lovon.tistory.com/118?category=862726 [Java 개발 블로그]
/** * email 형식 검사 * @param email : 이메일 * @return boolean : 이메일 형식 여부 * */ public static boolean isEmail(String email){ boolean validation = false; if(StringUtils.isEmpty(email)){ return false; } String regex = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(email); if(m.matches()) { validation = true; } return validation; } 출처: https://l..
/** * 전화번호(핸드폰번호)에 구분자를 추가 * @param phoneNumber : 전화번호 * @param str : 구분자 * */ public String convertPhoneNumber(String phoneNumber, String str) { try{ if (phoneNumber == null) { return ""; } if (phoneNumber.length() == 8) { return phoneNumber.replaceFirst("^([0-9]{4})([0-9]{4})$", "$1" + str + "$2"); } else if (phoneNumber.length() == 12) { return phoneNumber.replaceFirst("(^[0-9]{4})([0-9]{4})(..
HashMap을 반복문을 통해 조회하는 방법을 확인한다. 대부분 keySet을 사용하여 조회하지만, Map에서 Key에 해당하는 값을 조회하는 비용이 추가로 발생하므로, 왠만하면 entrySet 사용을 추천한다. HashMap map = new HashMap(); map.put("a", 1); map.put("b", 2); map.put("c", 3); // keySet을 사용한 조회 (키에 해당하는 값을 Map에서 재조회하는 비용이 추가로 소모된다) for (String s : map.keySet()) { System.out.println(s + "/" + map.get(s)); } System.out.println("-----"); // entrySet을 사용한 조회 (Map 재조회에 대한 비용 소모..