728x90
반응형

🎃 에러

public static void main(String[] args) {
		int num = 100/0;
	}

자바에는 '100/0'과 같은 무한대 값을 표현할만한 자료형이 없다.

 

이 코드를 실행하면 빨간줄은 없지만, 무한대 값에 대한 오류가 난다.

 

 

개발 중 Console에서 이러한 예외 문구를 본 적이 있을것이다.

 

해당 사진에서는 int num = 100/0; 부분에서 ArthmeticException이라는 예외가 발생했다고 한다.

 

실행 전에는 빨간줄이 없었는데 이런 문구가 나온다면, 에러 중에서도 예외처리가 가능한 에러인 것이다.

 

 

 

 

 

💊 예외 처리

public static void main(String[] args) {
		try {
			int num = 100/0;
		} catch(ArithmeticException e) {
			e.printStackTrace();
			System.out.println("0으로 나누면 예외가 발생합니다. 프로그램을 종료하겠습니다.");
			
			return; // 메인메서드를 강제종료
		} finally {
			System.out.println("저는 항상 실행됩니다.");
		}
		
	}

try / catch / finally 를 사용하여 예외 처리를 진행한다.

 

try : 예외 처리를 할 코드 (문제가 생길만한 코드)

catch : 예외 처리 (오류가 난 경우 실행될 코드)

finally : 예외처리 여부에 상관없이 무조건 실행되는 코드

 

catch(예외 e)를 적어주면 그 예외에 대한 검사를 하는데, catch(Exception e)로 작성해도 무방하다.

모든 예외들은 Exception을 상속받고 있기 때문에 부모인 Exception을 사용하면 모든 예외가 처리된다. (다형성)

다만 여러 종류의 예외를 각각 다르게 처리하려면 예외를 정확하게 적는 것을 추천한다.

 

e.printStackTrace();를 통해 예외 발생시 Console에 뜨는 문구를 확인할 수 있다.

 

 

 

예외처리가 정상적으로 되었고, 예외 문구도 같이 출력되었다.

 

catch에서 메인메서드를 종료하는 return도 존재했지만, finally는 무조건 실행된다.

728x90
반응형
728x90
반응형

📖 Map

	public static void main(String[] args) {
		Map<String, Object>map = new HashMap<>();
		map.put("name", "러아니푸");
		map.put("pet","순돌이");
		map.put("age",99);
		
		System.out.println(map.get("name")); // 키로 값을 출력
		System.out.println("");
		
		for(String k :map.keySet()) { // 키만 출력
			System.out.println(k);
		}
		System.out.println("");
		
		for(Object v : map.values()) { // 값만 출력
			System.out.println(v);
		}
	}

 

  • 키와 값으로 구성되어있다.
  • 여러 타입의 값을 저장하기에 좋다.
  • 키값은 중복이 허용되지 않지만, 값은 상관없다.
  • for문의 사용이 어렵고, foreach문을 통해 키와 값을 출력할 수 있다.

 

 

 

📖 table join 데이터 받아오는 방법

Emp.java : 사원 정보를 담는 Vo

public class Emp {
	private int empNo;
	private String empName;
	private int deptNo;
    
    // setter/getter, toStrint() 넣어야 합니다
}

 

 

Dept.java : 부서 정보를 담는 Vo

public class Dept {
	private int deptNo;
	private String deptName;
	private String deptLoc;
	
	// setter/getter, toStrint() 넣어야 합니다
}

 

   

    => 사원과 부서 테이블을 join했을 경우의 값을 받아온다.

 

 

 

 

 

😀 Vo 사용으로 처리

 

EmpAndDept.java : Emp와 Dept를 넣은 Vo

public class EmpAndDept {
	private Emp emp;
	private Dept dept;
    // setter/getter, toStrint() 넣어야 합니다
}

 

 

 

 

main.java

   public EmpAndDept selectEmpVoOne() {
      // 사원 정보
      Emp emp = new Emp();
      emp.setEmpNo(1);
      emp.setEmpName("러아니푸");
      emp.setDeptNo(100);
      
      // 부서 정보
      Dept dept = new Dept();
      dept.setDeptNo(100);
      dept.setDeptName("티스토리");
      dept.setDeptLoc("카카오");
      
      // 사원과 부서
      EmpAndDept end = new EmpAndDept();
      end.setEmp(emp);
      end.setDept(dept);
      
      return end;
   }
   
   public static void main(String[] args) {
   
      EmpDao empDao = new EmpDao();   
      EmpAndDept end = empDao.selectEmpVoOne();
      System.out.println(end);
   }

 

  *실제로는 selectEmpVoOne()은 EmpDao에 넣고 사용합니다*

 

  • 새로운 Vo에 join되는 테이블의 객체를 넣어 사용합니다.
  • 이 방식은 새로운 형식의 join을 할 때 마다, 그에 맞는 Vo를 만들어 줘야 하는 방식입니다.
  • 자주 join되는 테이블이면 몰라도 한 두번 사용하는 join을 위해 만드는 것은 비효율적입니다.

 

 

 

😀 Map 사용으로 처리

 

main.java

   public Map<String, Object> selectEmpMapOne() {
      Map<String, Object> map = new HashMap<>();
      Emp emp = new Emp();
      emp.setEmpNo(1);
      emp.setEmpName("러아니푸");
      emp.setDeptNo(100);
      
      Dept dept = new Dept();
      dept.setDeptNo(100);
      dept.setDeptName("티스토리");
      dept.setDeptLoc("카카오");
      
      map.put("emp", emp);
      map.put("dept", dept);
      
      return map;
   }
   
   public static void main(String[] args) {
   
      EmpDao empDao = new EmpDao();
      Map<String, Object> map = empDao.selectEmpMapOne();
      Emp emp = (Emp)map.get("emp");
      Dept dept = (Dept)map.get("dept");
      System.out.println(emp);
      System.out.println(dept);
   }

 

*실제로는 selectEmpVoOne()은 EmpDao에 넣고 사용합니다*

 

  • Emp와 Dept 각각을 Map에 넣어 사용합니다.
  • 새로운 Vo를 만들지 않아 편리하지만 받아서 사용할때는 형변환을 해야합니다.
  • 값을 받아올 필드의 개수가 적다면 굳이 Emp, Dept의 객체를 넘기지않고, 키값에 맞춰 값만 넘겨도 좋습니다.

 

728x90
반응형
728x90
반응형
list
public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(7);
		list.add(3);
		list.add(2);
		list.add(3);
		System.out.println("toString() 오버라이딩 : "+list);
		
        // for문
		for(int i=0;i<list.size();i++) {
			System.out.print(list.get(i));
		}
		System.out.println("");
		
		// foreach문
		for(Integer n :list) {
			System.out.print(n);
		}
		
	}

 

  • 입력된 값이 순차적으로 들어간다 -> index를 가지기 때문에 for 사용가능
  •  For, foreach 모두 사용 가능하다.
  • System.out.println(list); 형식으로 출력하면 toString()메서드가 오버라이딩 되어있는 것을 알 수 있다.
  • 중복된 값이 들어가도 누락되지 않고 들어간다.

 

 

 

 

 

set
public static void main(String[] args) {
		Set<Integer> set = new HashSet<>();
		set.add(1);
		set.add(7);
		set.add(3);
		set.add(2);
		set.add(3);
		System.out.println("toString 오버라이딩 : "+set);
		
		for(int i=0;i<set.size(); i++) {
			// set은 순서(인덱스)가 없기 때문에 이런식 출력 불가
		}
		
        // foreach문은 가능
		for(Integer n : set) {
			System.out.print(n);
		}

	}

 

  • 입력된 값의 순서가 보장되지 않는다.
  • 순서(인덱스)가 없기 때문에 for를 사용할 수 없다. (foreach는 가능)
  • toString()메서드가 오버라이딩 되어있다.
  • 중복을 허용하지 않기 때문에 중복된 값을 넣으려고 할 경우 무시한다.

 

728x90
반응형
728x90
반응형
생성자 메서드
public class Wow {
	
	public Wow() {
	}
	
}

 

- 생성자 메서드는 클래스 명과 동일한 이름을 가지고있습니다.

- 만약 코드에 생성자 메서드가 없다면 디폴트생성자가 컴파일시 자동으로 생성합니다.

 

Wow wow = new Wow( ); 와 같은 객체 생성 코드를 본적이 있으실겁니다.

new는 객체를 만드는 연산자이며, Wow( ) 생성자 메서드를 사용하여 객체를 생성하는 것 입니다.

 

 

 

 

 

일반 메서드
public class Wow {
	
    // 입력 X, 리턴 X
	public void hello() {
		System.out.println("hello");
	}
	
    // 입력 O, 리턴 X
	public void print(String str) {
		System.out.println(str);
	}
    
    // 입력 X, 리턴 O
    public int year(){
    	return 365;
    }
    
	
    // 입력 O, 리턴 O
	public int add(int x, int y) {
		return x+y;
	}	
}

- 일반메서드는 입력값과 리턴값의 유무로 4가지의 형태가 존재합니다.

- 코드의 public 다음위치에는 리턴값의 자료형이 나오고, 리턴값이 없다면 void로 선언하시면 됩니다.

- 입력값이 있는 경우에는 메서드명 다음에 괄호를 열고 넣어주시면 됩니다.

 

public class Wow {
	public static void main(String[] args) {
		Wow wow = new Wow(); // 생성자 메서드
		wow.hello();
		wow.print("fjdkslvn의 블로그");
		System.out.println(wow.year());
		System.out.println(wow.add(1, 2));
	}
}

- 생성자 메서드를 사용하여 객체를 생성합니다.

- 생성된 객체로 메서드를 사용합니다.

- 리턴값이 없는 메서드는 단독으로 사용하고, 리턴값이 있는 함수는 변수처럼 활용 가능합니다.

 

 

결과

 

728x90
반응형
728x90
반응형
정보은닉과 캡슐화

 

 

package vo;

public class Member {
	// 정보은닉
	private String memberId;
	private String memberPw;
	private String memberName;
	private int memberAge;
	private String memberGender;
	private String memberDate;
	
	// 캡슐화(값을 불러오는 함수)
	public String getMemberId() {
		return memberId;
	}
	// 캡슐화(값을 변경하는 함수)
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPw() {
		return memberPw;
	}
	public void setMemberPw(String memberPw) {
		this.memberPw = memberPw;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public int getMemberAge() {
		return memberAge;
	}
	public void setMemberAge(int memberAge) {
		this.memberAge = memberAge;
	}
	public String getMemberGender() {
		return memberGender;
	}
	public void setMemberGender(String memberGender) {
		this.memberGender = memberGender;
	}
	public String getMemberDate() {
		return memberDate;
	}
	public void setMemberDate(String memberDate) {
		this.memberDate = memberDate;
	}
	
	
}

 

public: 프로젝트 안에서 원활하게 사용 가능하다.

private: 자신이 포함된 클래스에서만 직접 접근이 가능하고, 프로젝트 안에서 해당 클래스를 제외한 다른 위치에서 불러올 시 정보은닉으로 인해 값에 직접 접근할 수 없다.

 

public은 변수값에 곧바로 접근할 수 있지만, private는 정보은닉된 변수이기 때문에 캡슐화된 메서드를 사용하지 않고는 접근할 수 없다.

 

그래서 getter, setter 메서드를 사용하여 변수값을 가져오거나 변수에 값을 넣을 수 있도록 한다.

 

 

 

 

 

 

 

이클립스에서 getter, setter 자동 생성

 

1. 여백에서 우클릭 -> Source -> Generate Getters and Setters

 

 

 

 

 

2. Select All( or 원하는 변수만 선택) -> Generate

 

 

 

 

 

3. 설정 완료

728x90
반응형
728x90
반응형
ArrayList 정리

 

- ArrayList 선언

import java.util.ArrayList;

public class Array {

	public static void main(String[] args) {
		// 동적 배열 선언
		ArrayList<String> str = new ArrayList<>();
    }
}

ArrayList를 사용하기 위해 java.util.ArrayList를 import합니다. Java.util.*로 대체해도 가능합니다.

 

ArrayList<자료형> 배열이름 = new ArrayList<자료형 생략가능>(숫자쓰면 크기지정 / 리스트  쓰면 복사);

 

특별한 일이 없다면 ArrayList<String> str = new ArrayList<>();로 선언하셔도 좋습니다.

 

 

 

 

 

 

 

 

 

 


- ArrayList 값 추가

 

 

		// 리스트에 값 추가
		str.add("fjdkslvn@gmail.com");
		str.add("djmax@gmail.com");
		str.add("fullmetal@gmail.com");
		System.out.println(str+" <-- 리스트에 값 추가");
		
		// 원하는 위치에 값 추가
		str.add(1,"demon@gmail.com");
		System.out.println(str+" <-- 원하는 위치에 값 추가");
        
        // 해당 위치 값 변경
		str.set(2, "alchemist@gmail.com");

리스트명.add(내용물); 로 리스트에 값을 추가할 수 있습니다.

 

리스트명.add(위치,내용물); 로 위치를 지정해서 값을 추가할 수도 있습니다.

지정하지않으면 출력기준 맨 오른쪽에 들어갑니다.

 

리스트명.set(위치,내용물); 로 값을 변경할 수 있습니다.

 

 

 

 

 

 

 

 


- ArrayList 값 접근 / 문자열 자르기

 

 

		// 특정 요소 접근
		System.out.println(str.get(1)+" <-- 특정 요소 접근");
		
		// 특정 요소 문자열 자르기
		System.out.println(str.get(1).split("@")[0]+" <-- 특정 요소 문자열 자르기");

리스트명.get(위치)를 통해 특정 요소에 접근할 수 있습니다.

 

리스트명.get(위치).split("문자열을 자를 기준")[자른 후 선택할 문자열]을 통해 문자열을 자르고 원하는 값만 가져올 수 있습니다. 만약 위 코드에서 str.get(1).split("@")[1]이라고 했다면 gmail.com이 출력됐을겁니다.

 

 

 

 

 

 

 

 

 

 


- ArrayList 반복문을 통해 출력

 

 

		// foreach를 사용하여 리스트 값 출력하기
		for (String st : str) {
            System.out.println(st);
        }

* 일반적인 for문을 사용해도 무방합니다*

 

for(자료형 변수 : 리스트명)의 형태로 이루어져있습니다. 코드에서 st라는 부분은 각 리스트값을 가져올 변수를 의미합니다. 리스트 길이만큼 반복문이 진행되면서 리스트 요소를 st로 뽑아옵니다.

 

이걸 사용하면 숫자값이 1씩 증가하는 i변수를 쓰진 못하지만 간편합니다. 1씩 증가하는 숫자값을 쓰고싶다면 while에서 처럼 직접 변수를 생성하여 반복문이 끝날쯤에 숫자를 1씩 증가시켜줍시다.

 

 

 

 

 

 

 

 

 

 

 

 


- ArrayList 요소 포함 여부

 

 

		// 특정 요소가 포함되어있는지 확인
		boolean bool = str.contains("fjdkslvn@gmail.com");
        System.out.println(bool+" <-- 특정 요소가 포함되어있는지");
        
        // 특정 요소가 포함되어있으면 위치 추출
        int num = str.indexOf("fjdkslvn@gmail.com");
        System.out.println(num+" <-- 요소가 있으면 위치 추출");

리스트명.contains(요소)를 통해 특정 요소가 포함되어있는지 확인할 수 있습니다.

 

리스트명.index0f(요소)를 통해 특정 요소가 포함되어있으면 해당 위치를 추출할 수 있습니다.

=> 만약 포함되어있지 않다면 '-1'을 반환합니다.

 

 

 

 

 

 

 

 


- ArrayList 삭제 / 길이 추출

 

 

		// 리스트 길이 추출
		System.out.println(str.size()+" <-- 리스트 길이 추출");
		
		// 리스트 요소 삭제
		String rm = str.remove(1);
		System.out.println(rm+" <-- 삭제된 값");
		System.out.println(str+" <-- 리스트 요소 삭제 후");
		
		// 리스트 비우기
		str.clear();
		System.out.println(str+" <-- 리스트 비우기");

리스트명.size()를 통해 리스트 길이를 추출할 수 있습니다.

 

리스트명.remove(위치)를 통해 리스트 요소를 삭제할 수 있고, 해당 값을 담아서 활용할 수 있습니다.

 

리스트명.clear()를 통해 리스트를 비울 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 


전체 코드

 

 

Array.java

import java.util.ArrayList;

public class Array {

	public static void main(String[] args) {
		// 동적 배열 선언
		ArrayList<String> str = new ArrayList<>();
		
		// 리스트에 값 추가
		str.add("fjdkslvn@gmail.com");
		str.add("djmax@gmail.com");
		str.add("fullmetal@gmail.com");
		System.out.println(str+" <-- 리스트에 값 추가");
		
		// 원하는 위치에 값 추가
		str.add(1,"demon@gmail.com");
		System.out.println(str+" <-- 원하는 위치에 값 추가");
		
		// 해당 위치 값 변경
		str.set(2, "alchemist@gmail.com");
		System.out.println(str+" <-- 해당 위치 값 변경");
		
		// 특정 요소 접근
		System.out.println(str.get(1)+" <-- 특정 요소 접근");
		
		// 특정 요소 문자열 자르기
		System.out.println(str.get(1).split("@")[0]+" <-- 특정 요소 문자열 자르기");
		
		// foreach를 사용하여 리스트 값 출력
		for (String st : str) {
            System.out.println(st);
        }
		
		// 특정 요소가 포함되어있는지 확인
		boolean bool = str.contains("fjdkslvn@gmail.com");
          System.out.println(bool+" <-- 특정 요소가 포함되어있는지");

          // 특정 요소가 포함되어있으면 위치 추출
          int num = str.indexOf("fjdkslvn@gmail.com");
          System.out.println(num+" <-- 요소가 있으면 위치 추출");
	
		// 리스트 길이 추출
		System.out.println(str.size()+" <-- 리스트 길이 추출");
		
		// 리스트 요소 삭제
		String rm = str.remove(1);
		System.out.println(rm+" <-- 삭제된 값");
		System.out.println(str+" <-- 리스트 요소 삭제 후");
		
		// 리스트 비우기
		str.clear();
		System.out.println(str+" <-- 리스트 비우기");
		
		
	}

}

 

 

728x90
반응형
728x90
반응형

Cal.java

import java.util.Calendar;

public class Cal {

	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int day = cal.get(Calendar.DAY_OF_MONTH);
		
		System.out.println(year+"-"+month+"-"+day);
	}

}

MONTH 부분에 +1을 하지않고 출력하면 저번달 숫자가 나옵니다.

 

원인은 모르지만 보기 편하게 +1을 하고 사용합시다.

728x90
반응형
728x90
반응형
public class test {

	public static void main(String[] args) {
		String str ="200";
		int num;
		
		
		// 문자를 숫자로 변환
		num=Integer.parseInt(str);
		System.out.println(num+" <--문자를 숫자로 변환");
		
		num +=100; // num==300
		
		// 숫자를 문자로 변환
		str = Integer.toString(num);
		System.out.println(str+" <--숫자를 문자로 변환");
		
	}

}

 

 

 

728x90
반응형
728x90
반응형
 데이터타입 클래스

 

public class Demon { // 귀멸의 칼날 캐릭터
	
	public String name; // 이름
	public int age; // 나이
	public String gender; // 성별
	public boolean oni; // 오니 여부
	
}

저는 구조체처럼 보이기도 하고 데이터베이스의 스키마 같은 역할을 하는것 처럼 보인다고 생각했습니다.

 

 

 

객체 생성 및 활용

 

이름을 간단하게 출력해봅시다

 

- for문을 사용하여 이름 출력하기

 

public class DemonMain {

	public static void main(String[] args) {
    	// 객체 생성
		Demon d1 = new Demon();
		d1.name = "탄지로"; 
		d1.age = 16;
		d1.gender = "남자";
		d1.oni = false;
		
		Demon d2 = new Demon();
		d2.name = "네즈코"; 
		d2.age = 15;
		d2.gender = "여자";
		d2.oni = true;
		
		Demon d3 = new Demon();
		d3.name = "렌고쿠"; 
		d3.age = 18;
		d3.gender = "남자";
		d3.oni = false;
		
		Demon d4 = new Demon();
		d4.name = "아카자"; 
		d4.age = 200;
		d4.gender = "남자";
		d4.oni = true;
		
        // 정적 배열과 일반 for문에 넣어서 활용
		Demon[] demon = {d1,d2,d3,d4};
		
		for(int i=0;i<demon.length;i++) {
			System.out.print(demon[i].name+" ");
		}
		
	}
}

객체의 각 요소는 객체.변수의 모양으로 사용할 수 있습니다.

 

 

 

 

 

- foreach문을 사용하여 이름 출력하기

 

// foreach문
for(Demon d:demon) {
	System.out.print(d.name +" ");
}

for(데이터 타입 변수명 : 사용할 배열) 의 모양으로 이루어져 있습니다. 일반적인 for문과 달리 특정한 증가값을 쓰지 않습니다. 자체적으로 넣어준 배열속 위치를 하나씩 증가시키면서 실행됩니다.

 

(python for문에서 리스트를 넣어 사용하는 느낌이라고 생각합니다)

 

 

 

728x90
반응형
728x90
반응형

 

qr코드를 인식하기 위해 pyzbar를 설치하고 실행했는데 자꾸 오류가 납니다.

 

설치된 곳에 들어갔지만 libzbar-64.dll도 잘 들어있습니다.

 

 

- 오류 - 

더보기

Traceback (most recent call last):
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\zbar_library.py", line 58, in load
    dependencies, libzbar = load_objects(Path(''))
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\zbar_library.py", line 50, in load_objects
    deps = [
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\zbar_library.py", line 51, in <listcomp>
    cdll.LoadLibrary(str(directory.joinpath(dep)))
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\ctypes\__init__.py", line 452, in LoadLibrary
    return self._dlltype(name)
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\ctypes\__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'libiconv.dll' (or one of its dependencies). Try using the full path with constructor syntax.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\한이음\QR\aws rds와 바코드인식 연동.py", line 3, in <module>
    from pyzbar import pyzbar
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\pyzbar.py", line 7, in <module>
    from .wrapper import (
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\wrapper.py", line 139, in <module>
    zbar_version = zbar_function(
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\wrapper.py", line 136, in zbar_function
    return prototype((fname, load_libzbar()))
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\wrapper.py", line 115, in load_libzbar
    libzbar, dependencies = zbar_library.load()
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\zbar_library.py", line 60, in load
    dependencies, libzbar = load_objects(Path(__file__).parent)
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\zbar_library.py", line 54, in load_objects
    libzbar = cdll.LoadLibrary(str(directory.joinpath(fname)))
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\ctypes\__init__.py", line 452, in LoadLibrary
    return self._dlltype(name)
  File "C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\ctypes\__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'C:\Users\fjdks\AppData\Local\Programs\Python\Python39\lib\site-packages\pyzbar\libzbar-64.dll' (or one of its dependencies). Try using the full path with constructor syntax.

 

 

 

집에있는 오래된 PC에서는 문제없이 실행되는데 새로운 노트북에서만 자꾸 실행이 되지 않았습니다. PC의 파이썬 자체를 가져와서 노트북에서 실행하는 것도 실패했습니다. 그러던 도중 해결 방법을 찾았습니다.

 

 

 

 

해결 방법

Download Visual Studio 2013용 Visual C++ 재배포 가능 패키지 from Official Microsoft Download Center

 

Download Visual Studio 2013용 Visual C++ 재배포 가능 패키지 from Official Microsoft Download Center

중요! 아래에서 언어를 선택하면 전체 페이지 내용이 해당 언어로 신속하게 변경됩니다. 독일어러시아어스페인어영어이탈리아어일본어중국어(간체)중국어(번체)프랑스어한국어 다운로드 Visual

www.microsoft.com

 

Visual C++을 다운로드 받으시면 됩니다. 저는 2013버전을 받고 해결되었고 2019 버전은 효과가 없었습니다. 2015-2019 라고 써있던 버전인데도 안됐으니까.. 2013을 다운받는걸 추천드립니다.

 

 

오래된 PC에서는 여러버전의 C++이 설치되어 있었는데 새로 산 노트북은 2013을 설치하기 전에 C++ 프로그램이 전혀 없었습니다. pyzbar도 C++을 사용하네요....

728x90
반응형

'언어 > Python' 카테고리의 다른 글

파이썬 함수  (0) 2021.07.16
파이썬 조건문과 반복문  (0) 2021.07.09
파이썬 리스트와 딕셔너리  (0) 2021.07.07
파이썬 문자열 다루기  (0) 2021.07.06
파이썬 변수 선언과 자료형  (0) 2021.07.02

+ Recent posts