한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지_패스트 캠퍼스 챌린지 20일차

2021. 9. 25. 20:34IT공부/Java&Spring 이용한 웹프로그래밍

03. String, StringBuilder, StringBuffer 클래스, text block

String 클래스

  • String 선언하기

String str1 = new String("abc");

String str2 = "abc";

  • 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 두 가지 방법
  • 힙 메모리는 생성될때마다 다른 주소 값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가짐

public class StringTest {

     public static void main(String[] args) {

            String str1 = new String("abc");

            String str2 = new String("abc");

 

            System.out.println(str1 == str2);

           

            String str3 = "abc";

            String str4 = "abc";

 

            System.out.println(str3 == str4);

            }

}

  • 한번 생성된 String은 불변(immutable)
  • String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성됨 ( 메모리 낭비가 발생할 수도 )

public class StringTest2 {

          public static void main(String[] args) {

               String java = new String("java");

               String android = new String("android");

               System.out.println(System.identityHashCode(java));

 

               java = java.concat(android);

               System.out.println(java);

               System.out.println(System.identityHashCode(java));

            }

 }

StringBuilder, StringBuffer 활용하기

  • 내부적으로 가변적인 char[]를 멤버 변수로 가짐
  • 문자열을 여러번 연결하거나 변경할 때 사용하면 유용함
  • 새로운 인스턴스를 생성하지 않고 char[] 를 변경함
  • StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(synchronization)을 보장
  • 단인 쓰레드 프로그램에서는 StringBuilder 사용을 권장
  • toString() 메서드로 String반환

public class StringBuilderTest {

            public static void main(String[] args) {

             String java = new String("java");

             String android = new String("android");

             StringBuilder buffer = new StringBuilder(java);

             System.out.println(System.identityHashCode(buffer));

             buffer.append("android");

             System.out.println(System.identityHashCode(buffer));

            java = buffer.toString();

         }

}

text block 사용하기 (java 13)

  • 문자열을 """ """ 사이에 이어서 만들 수 있음
  • html, json 문자열을 만드는데 유용하게 사용할 수 있음

public class StringTextBlock {

         public static void main(String[] args) {

           String strBlock = """

                                 This

                                 is

                                 text

                                 block

                                 test.""";

           System.out.println(strBlock);

           System.out.println(getBlockOfHtml());

       }

       public static String getBlockOfHtml() {

                return """

                           <html>

                               <body>

                                    <span>example text</span>

                               </body>

                          </html>""";

           }

}

 

04. Class 클래스 사용하기

Class 클래스

  • 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일이 생성됨
  • Class 클래스는 컴파일 된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공됨
  • Class.forName("클래스 이름") 메서드로 클래스를 동적으로 로드 함

Class c = Class.forName("java.lang.String");

  • 클래스 이름으로 직접 Class 클래스 가져오기

Class c = String.class;

  • 생성된 인스턴스에서 Class 클래스 가져오기

String s = new String();

Class c = s.getClass(); //Object 메서드

동적 로딩

  • 컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행(runtime) 중에 데이터 타입을 binding 하는 방법
  • 프로그래밍 시에는 문자열 변수로 처리했다가 런타임시에 원하는 클래스를 로딩하여 binding 할 수 있다는 장점
  • 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 오류가 발생하면 프로그램의 심각한 장애가 발생가능

Class의 newInstance()메서드로 인스턴스 생성

  • new 키워드를 사용하지 않고 클래스 정보를 활용하여 인스턴스를 생성할 수 있음

클래스 정보 알아보기

  • reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍
  • 로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
  • java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍
  • 일반적으로 자료형을 알고 있는 경우엔 사용하지 않음

StringTest.java

             public class StringTest {

               public static void main(String[] args) throws ClassNotFoundException {

                           Class c3 = Class.forName("java.lang.String");

                        Constructor<String>[] cons = c3.getConstructors();

                        for(Constructor con: cons) {

                                    System.out.println(con);

                        }

                        System.out.println();

                        Method[] methods = c3.getMethods();

                        for(Method method : methods) {

                                  System.out.println(method);

                      }

            }

  }

 

Person.java

public class Person {

             private String name;

             private int age;

             public Person() {};

            public Person(String name) {

                  this.name = name;

             }

            public Person(String name, int age) {

             this.name = name;

             this.age = age;

             }

             public 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;

           }

           public String toString() {

                return name;

          }

 }

 

ClassTest.java

    public class ClassTest {

         public static void main(String[] args) throws InstantiationException, IllegalAccessException,          IllegalArgumentException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException, SecurityException {

               Person person = new Person("James");

               System.out.println(person);

               Class c1 = Class.forName("ch04.Person");

              Person person1 = (Person)c1.newInstance();

              System.out.println(person1);

              Class[] parameterTypes = {String.class};

              Constructor cons = c1.getConstructor(parameterTypes);

             Object[] initargs = {"김유신"};

             Person personLee = (Person)cons.newInstance(initargs);

             System.out.println(personLee);

         }

}

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

강의에 대해 정확하게 알고 싶다면 

https://bit.ly/37BpXiC