[TIL - 230706] 객체지향 핵심과 자바의 유용한 클래스들

sum·2023년 7월 6일
0

TIL

목록 보기
2/3

오늘 공부한 내용👩‍💻

  • 상속 - 클래스 상속, 클래스 생성 과정과 형변환
  • 메서드 재정의하기(오버라이딩)
  • 다형성
  • 다운캐스팅과 instanceof
  • 추상 클래스
  • 인터페이스 - 정의와 구현, 형변환, 다형성, DAO 구현, 여러가지 요소, 상속
  • Object - toString() 메서드, equals() 메서드, hashCode() 메서드, clone() 메서드
  • String, StringBuilder, StringBuffer 클래스, text block
  • Class - 동적 로딩, newInstance() 메서드로 인스턴스 생성, 클래스 정보 알아보기


어려웠던 내용

  • 논리적으로 동일함을 위해 equals() 메서드를 재정의했다면 hashCode() 메서드도 재정의 하여 동일한 hashCode 값이 반환되도록 한다.

오류 해결

코드

public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("db.properties");
        Properties prop = new Properties();
        prop.load(fis);

        String dbType = prop.getProperty("DB-TYPE");

        UserInfo userInfo = new UserInfo();
        userInfo.setUserId("12345");
        userInfo.setPassword("!@#$%");
        userInfo.setUserName("이순신");


        UserInfoDao userInfoDao;

        if(dbType.equals("ORACLE")){
            userInfoDao = new UserInfoOracleDao();
        }
        else if(dbType.endsWith("MYSQL")){
            userInfoDao = new UserInfoMysqlDao();
        }
        else{
            System.out.println("db support error");
            return;
        }

        userInfoDao.insertUserInfo(userInfo);
        userInfoDao.updateUserInfo(userInfo);
        userInfoDao.deleteUserInfo(userInfo);
    }
}

오류 문구

java.io.FileNotFoundException: db.properties (No such file or directory)
	at java.base/java.io.FileInputStream.open0(Native Method)
	at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
	at Part3.ch13.web.userinfo.UserInfoClient.main(UserInfoClient.java:16)

1차 코드 수정

public class UserInfoClient {
    public static void main(String[] args) throws IOException {

        try {
            FileInputStream fis = new FileInputStream("db.properties");
            Properties prop = new Properties();
            prop.load(fis);

            String dbType = prop.getProperty("DB-TYPE");

            UserInfo userInfo = new UserInfo();
            userInfo.setUserId("12345");
            userInfo.setPassword("!@#$%");
            userInfo.setUserName("이순신");


            UserInfoDao userInfoDao;

            if(dbType.equals("ORACLE")){
                userInfoDao = new UserInfoOracleDao();
            }
            else if(dbType.endsWith("MYSQL")){
                userInfoDao = new UserInfoMysqlDao();
            }
            else{
                System.out.println("db support error");
                return;
            }

            userInfoDao.insertUserInfo(userInfo);
            userInfoDao.updateUserInfo(userInfo);
            userInfoDao.deleteUserInfo(userInfo);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return;


    }
}

이 블로그(https://rollbar.com/blog/java-filenotfoundexception/)를 보고 try-catch 구문을 통해 FileNotFoundException 예외 처리를 하면 된다는 방법을 찾고 코드를 수정해보았으나 여전히 똑같은 오류가 발생했다.

2차 코드 수정

public class UserInfoClient {
    public static void main(String[] args) throws IOException {

        try {
            FileInputStream fis = new FileInputStream("/Users/sum/Documents/Java/src/main/java/db.properties");
            Properties prop = new Properties();
            prop.load(fis);

            String dbType = prop.getProperty("DB-TYPE");

            UserInfo userInfo = new UserInfo();
            userInfo.setUserId("12345");
            userInfo.setPassword("!@#$%");
            userInfo.setUserName("이순신");


            UserInfoDao userInfoDao;

            if(dbType.equals("ORACLE")){
                userInfoDao = new UserInfoOracleDao();
            }
            else if(dbType.endsWith("MYSQL")){
                userInfoDao = new UserInfoMysqlDao();
            }
            else{
                System.out.println("db support error");
                return;
            }

            userInfoDao.insertUserInfo(userInfo);
            userInfoDao.updateUserInfo(userInfo);
            userInfoDao.deleteUserInfo(userInfo);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return;


    }
}

예전에 전공 시간에 파일 입출력을 다룰 때 c 드라이브부터 다 입력해야 했던 기억이 났다. 그리고 이때의 경험이 맞았다. 파일 이름에서 오류가 났다면, 콘텐츠 루트로부터의 경로로 수정해보고, 여기서 또 오류가 나니 절대 경로를 복사하여 드디어 오류에서 벗어날 수 있었다.


코드

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

오류 문구

Exception in thread "main" java.lang.ClassNotFoundException: ch04.Person
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:315)
	at Part4.ch04.ClassTest.main(ClassTest.java:8)

코드 수정

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

앞서 절대경로를 통해 문제를 해결한 바가 있어 클래스 이름을 콘텐츠 루트로부터의 경로 복사 시도 후 소스 루트로부터의 경로 복사를 통해 오류 해결했다. 그런데 예외 발생 오류 문구 마지막 줄에 Part4부터 시작하는 것을 보니 앞으로 ClassNotFoundException 예외 발생 시 파일 경로는 오류 문구를 참조하면 될 것 같다.


궁금한 내용과 부족했던 내용

  • 상위 클래스에 선언된 private 멤버 변수는 하위 클래스에서 접근할 수 없으므로 외부 클래스에서 접근할 수는 없지만 하위 클래스에서의 접근을 허용하려면 protected 접근 제어자를 사용한다.
  • 다형성을 사용하지 않으면 많은 if-else 구문을 사용해야 한다.
  • 다형성을 통해 여러 클래스를 하나의 상위 클래스로 핸들링 할 수 있다.
  • hashCode()는 인스턴스의 저장 주소를 반환한다.
  • 해당 클래스의 clone() 메서드의 사용을 허용한다는 의미로 cloneable 인터페이스를 명시해 줌

느낀점

오래 막혀 있던 부분들을 해결하고 보니 별 게 아니었던 것들이라 후련함과 동시에 허탈함이 찾아왔다. 영문서에서도 try-catch만 보고 넘겼는데 til을 작성하려고 다시 페이지에 방문하고 보니 파일 경로가 제대로 작성돼 있는지 확인해보라는 내용이 있었다. 끝까지 읽었더라면 이 문제가 주말 안에는 해결되지 않았을까 하는 아쉬움이 남는다. 그래도 앞으로 오류 발생 시 try-catch로 1차 해결해보고 안 되면 파일 경로를 수정한다는 건 절대 잊지 않을 것 같다. 또한 오류 문구를 잘 읽어보자. 여기서 힌트를 얻을 수 있다. 역시 다 지나고 나서, 해결하고나서야 보이는 거 같다.

0개의 댓글